diff --git a/Makefile b/Makefile index b95a062..6111891 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,7 @@ package: $(BUILD_DIR) install: build rm -rf $(INSTALL_DIR) mkdir -p $(INSTALL_DIR) - cp -r $(BUILD_DIR)/* $(INSTALL_DIR) + cp -r $(BUILD_DIR)/${SRC_DIR}/* $(INSTALL_DIR) clean: rm -f $(COMPILED_SCHEMAS) $(MO_FILES) diff --git a/README.md b/README.md index bfe1121..c1ef344 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,11 @@ Either install it: - via EGS https://extensions.gnome.org/extension/3535/gitlab-extension/ - Or download latest release: https://github.com/cinatic/gitlab-extension/releases/latest +### Quick Start +Create a ***Profile access token*** in your profile settings https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html +and use it to create a new account entry in gitlab extension settings `Account Grid`. + + ## Data Source The data is fetched from the official GitLab API https://docs.gitlab.com/ee/api/. The API has some *limitions*, e.g. it only returns domain specific data. diff --git a/gitlab-extension@infinicode.de/components/buttons/iconButton.js b/gitlab-extension@infinicode.de/components/buttons/iconButton.js index e677468..f217223 100644 --- a/gitlab-extension@infinicode.de/components/buttons/iconButton.js +++ b/gitlab-extension@infinicode.de/components/buttons/iconButton.js @@ -10,7 +10,7 @@ var IconButton = GObject.registerClass({}, class IconButton extends St.Button { reactive: true, can_focus: true, track_hover: true, - style_class: 'icon-button ' + (style_class || ''), + style_class: 'icon-button button ' + (style_class || ''), y_align: Clutter.ActorAlign.CENTER, ...props }) diff --git a/gitlab-extension@infinicode.de/components/cards/commitCard.js b/gitlab-extension@infinicode.de/components/cards/commitCard.js index 2aabe40..a121df1 100644 --- a/gitlab-extension@infinicode.de/components/cards/commitCard.js +++ b/gitlab-extension@infinicode.de/components/cards/commitCard.js @@ -14,8 +14,7 @@ var CommitCard = GObject.registerClass({}, class CommitCard extends St.Button { super._init({ style_class: 'card message commit-card', can_focus: true, - x_expand: true, - hover: true + x_expand: true }) this.cardItem = commitItem diff --git a/gitlab-extension@infinicode.de/components/cards/pipelineCard.js b/gitlab-extension@infinicode.de/components/cards/pipelineCard.js index d04cb8f..86e7f60 100644 --- a/gitlab-extension@infinicode.de/components/cards/pipelineCard.js +++ b/gitlab-extension@infinicode.de/components/cards/pipelineCard.js @@ -14,8 +14,7 @@ var PipelineCard = GObject.registerClass({}, class PipelineCard extends St.Butto super._init({ style_class: 'card message pipeline-card', can_focus: true, - x_expand: true, - hover: true + x_expand: true }) this.cardItem = pipelineItem diff --git a/gitlab-extension@infinicode.de/components/cards/projectCard.js b/gitlab-extension@infinicode.de/components/cards/projectCard.js index a66c312..bbeefbe 100644 --- a/gitlab-extension@infinicode.de/components/cards/projectCard.js +++ b/gitlab-extension@infinicode.de/components/cards/projectCard.js @@ -14,8 +14,7 @@ var ProjectCard = GObject.registerClass({}, class ProjectCard extends St.Button super._init({ style_class: 'card message project-card', can_focus: true, - x_expand: true, - hover: true + x_expand: true }) this.cardItem = projectItem diff --git a/gitlab-extension@infinicode.de/components/gitlab/projectSelectButtons.js b/gitlab-extension@infinicode.de/components/gitlab/projectSelectButtons.js index 66de7c6..c339914 100644 --- a/gitlab-extension@infinicode.de/components/gitlab/projectSelectButtons.js +++ b/gitlab-extension@infinicode.de/components/gitlab/projectSelectButtons.js @@ -11,12 +11,14 @@ var ProjectSelectButtons = GObject.registerClass({}, class ProjectSelectButtons style_class: 'project-select-buttons' }) - Settings.connect('changed', (value, key) => { + this._settingsChangedId = Settings.connect('changed', (value, key) => { if (key === 'gitlab-accounts' || key === 'selected-gitlab-account-index') { this._sync() } }) + this.connect('destroy', this._onDestroy.bind(this)) + this._sync() } @@ -34,7 +36,7 @@ var ProjectSelectButtons = GObject.registerClass({}, class ProjectSelectButtons const gitlabAccountButton = new St.Button({ style_class: `message button ${additionalStyleClasses}`, - label: gitlabAccount.name, + label: gitlabAccount.name }) gitlabAccountButton.connect('clicked', () => { @@ -44,4 +46,10 @@ var ProjectSelectButtons = GObject.registerClass({}, class ProjectSelectButtons this.add_child(gitlabAccountButton) }) } + + _onDestroy () { + if (this._settingsChangedId) { + Settings.disconnect(this._settingsChangedId) + } + } }) diff --git a/gitlab-extension@infinicode.de/components/screenWrapper/screenWrapper.js b/gitlab-extension@infinicode.de/components/screenWrapper/screenWrapper.js index 52848ea..ebaf05a 100644 --- a/gitlab-extension@infinicode.de/components/screenWrapper/screenWrapper.js +++ b/gitlab-extension@infinicode.de/components/screenWrapper/screenWrapper.js @@ -1,4 +1,4 @@ -const { Clutter, GObject, St } = imports.gi +const { GObject, St } = imports.gi const ExtensionUtils = imports.misc.extensionUtils const Me = ExtensionUtils.getCurrentExtension() diff --git a/gitlab-extension@infinicode.de/components/screens/projectsScreen/projectsScreen.js b/gitlab-extension@infinicode.de/components/screens/projectsScreen/projectsScreen.js index e55210b..e9031a4 100644 --- a/gitlab-extension@infinicode.de/components/screens/projectsScreen/projectsScreen.js +++ b/gitlab-extension@infinicode.de/components/screens/projectsScreen/projectsScreen.js @@ -9,11 +9,22 @@ const { FlatList } = Me.imports.components.flatList.flatList const { ProjectSelectButtons } = Me.imports.components.gitlab.projectSelectButtons const { ProjectCard } = Me.imports.components.cards.projectCard const { SearchBar } = Me.imports.components.searchBar.searchBar -const { Settings } = Me.imports.helpers.settings + +const { + Settings, + GITLAB_ACCOUNTS, + SELECTED_GITLAB_ACCOUNT_INDEX +} = Me.imports.helpers.settings + const { Translations } = Me.imports.helpers.translations const GitLabService = Me.imports.services.gitlab +const SETTINGS_KEYS_TO_REFRESH = [ + GITLAB_ACCOUNTS, + SELECTED_GITLAB_ACCOUNT_INDEX +] + var ProjectsScreen = GObject.registerClass({}, class ProjectsScreen extends St.BoxLayout { _init () { super._init({ @@ -21,6 +32,8 @@ var ProjectsScreen = GObject.registerClass({}, class ProjectsScreen extends St.B vertical: true }) + this._settingsChangedId = null + const searchBar = new SearchBar() this._list = new FlatList() @@ -39,8 +52,8 @@ var ProjectsScreen = GObject.registerClass({}, class ProjectsScreen extends St.B searchBar.connect('text-change', (sender, searchText) => this._filter_results(searchText)) - Settings.connect('changed', (value, key) => { - if (key === 'gitlab-accounts' || key === 'selected-gitlab-account-index') { + this._settingsChangedId = Settings.connect('changed', (value, key) => { + if (SETTINGS_KEYS_TO_REFRESH.includes(key)) { this._loadData() } @@ -54,6 +67,8 @@ var ProjectsScreen = GObject.registerClass({}, class ProjectsScreen extends St.B } })) + this.connect('destroy', this._onDestroy.bind(this)) + this._loadData() } @@ -108,4 +123,10 @@ var ProjectsScreen = GObject.registerClass({}, class ProjectsScreen extends St.B this._list.addItem(new ProjectCard(project, latestPipeline)) }) } + + _onDestroy () { + if (this._settingsChangedId) { + Settings.disconnect(this._settingsChangedId) + } + } }) diff --git a/gitlab-extension@infinicode.de/components/searchBar/searchBar.js b/gitlab-extension@infinicode.de/components/searchBar/searchBar.js index 5c1f0b0..7dededa 100644 --- a/gitlab-extension@infinicode.de/components/searchBar/searchBar.js +++ b/gitlab-extension@infinicode.de/components/searchBar/searchBar.js @@ -78,7 +78,7 @@ var SearchBar = GObject.registerClass({ } _createButtonBox () { - let buttonBox = new St.BoxLayout({ + const buttonBox = new St.BoxLayout({ style_class: 'button-box', x_align: St.Align.END }) diff --git a/gitlab-extension@infinicode.de/extension.js b/gitlab-extension@infinicode.de/extension.js index c42b82d..0ff1035 100644 --- a/gitlab-extension@infinicode.de/extension.js +++ b/gitlab-extension@infinicode.de/extension.js @@ -49,6 +49,7 @@ var GitLabPanelMenuButton = GObject.registerClass( super._init(0.5) this._currentPanelPosition = null + this._settingsChangedId = null const panelMenuIcon = new St.Icon({ gicon: ComponentsHelper.getCustomIconPath('gitlab-symbolic'), @@ -71,11 +72,11 @@ var GitLabPanelMenuButton = GObject.registerClass( this._screenWrapper = new ScreenWrapper() bin.add_actor(this._screenWrapper) - Settings.connect('changed', () => this._sync()) + this._settingsChangedId = Settings.connect('changed', () => this._sync()) + this.menu.connect('destroy', this._destroyExtension.bind(this)) + EventHandler.connect('hide-panel', () => this.menu.close()) this._sync() - - EventHandler.connect('hide-panel', () => this.menu.close()) } _sync () { @@ -122,12 +123,10 @@ var GitLabPanelMenuButton = GObject.registerClass( this._currentPanelPosition = newPosition } - stop () { - // TODO: - // clear cache (add cache before ^^) - // ensure if destroy signal is bubbled correctly - // - unregister signal connections - // - dispose components + _destroyExtension () { + if (this._settingsChangedId) { + Settings.disconnect(this._settingsChangedId) + } } } ) @@ -144,6 +143,5 @@ function enable () { } function disable () { - gitlabPanelMenuButton.stop() gitlabPanelMenuButton.destroy() } diff --git a/gitlab-extension@infinicode.de/helpers/data.js b/gitlab-extension@infinicode.de/helpers/data.js index a2ecda0..1e438d5 100644 --- a/gitlab-extension@infinicode.de/helpers/data.js +++ b/gitlab-extension@infinicode.de/helpers/data.js @@ -1,3 +1,4 @@ +const ByteArray = imports.byteArray; const { GLib } = imports.gi let CACHE = {} @@ -14,7 +15,7 @@ var fallbackIfNaN = value => typeof value === 'undefined' || value === null || i var decodeBase64JsonOrDefault = (encodedJson, defaultValue) => { try { - const value = JSON.parse(GLib.base64_decode(encodedJson)) + const value = JSON.parse(ByteArray.toString(GLib.base64_decode(encodedJson))) if (!value) { return defaultValue diff --git a/gitlab-extension@infinicode.de/helpers/fetch.js b/gitlab-extension@infinicode.de/helpers/fetch.js index cd632dd..073a15a 100644 --- a/gitlab-extension@infinicode.de/helpers/fetch.js +++ b/gitlab-extension@infinicode.de/helpers/fetch.js @@ -1,9 +1,7 @@ const Soup = imports.gi.Soup -const _httpSession = new Soup.SessionAsync({ - user_agent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', - timeout: 10 -}) +const DEFAULT_TIME_OUT_IN_SECONDS = 10 +const DEFAULT_CHROME_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' const Response = class { constructor (message) { @@ -20,15 +18,19 @@ const Response = class { } blob () { - return this.message.response_body.data + return this.message?.response_body?.data } text () { - return this.message.response_body.data.toString() + return this.message.response_body?.data?.toString() } json () { - return JSON.parse(this.text()) + try { + return JSON.parse(this.text()) + } catch (e) { + return null + } } } @@ -46,7 +48,7 @@ const generateQueryString = params => { const paramKeyValues = Object.keys(params).filter(paramName => params[paramName]).map(paramName => { let paramValue = params[paramName] - if(typeof paramValue === 'boolean'){ + if (typeof paramValue === 'boolean') { paramValue = paramValue ? 1 : 0 } @@ -66,7 +68,12 @@ var fetch = ({ url, method = 'GET', headers, queryParameters }) => { appendHeaders(request_message, headers) } - _httpSession.queue_message(request_message, (source, response_message) => { + const httpSession = new Soup.SessionAsync({ + user_agent: DEFAULT_CHROME_USER_AGENT, + timeout: DEFAULT_TIME_OUT_IN_SECONDS + }) + + httpSession.queue_message(request_message, (source, response_message) => { const response = new Response(response_message) resolve(response) diff --git a/gitlab-extension@infinicode.de/helpers/settings.js b/gitlab-extension@infinicode.de/helpers/settings.js index 92e870b..3978373 100644 --- a/gitlab-extension@infinicode.de/helpers/settings.js +++ b/gitlab-extension@infinicode.de/helpers/settings.js @@ -3,7 +3,7 @@ const { GLib, Gio } = imports.gi const ExtensionUtils = imports.misc.extensionUtils const Me = ExtensionUtils.getCurrentExtension() -const { decodeBase64JsonOrDefault, isNullOrEmpty } = Me.imports.helpers.data +const { decodeBase64JsonOrDefault, isNullOrEmpty, isNullOrUndefined } = Me.imports.helpers.data const POSITION_IN_PANEL_KEY = 'position-in-panel' const GITLAB_TOKEN = 'gitlab-token' @@ -14,7 +14,8 @@ var SETTINGS_SCHEMA_DOMAIN = 'org.gnome.shell.extensions.gitlab' var DEFAULT_GITLAB_DATA = { name: 'gitlab.com', - apiEndpoint: 'https://gitlab.com/api/v4' + apiEndpoint: 'https://gitlab.com/api/v4', + onlyOwnedProjects: false } /** @@ -87,6 +88,35 @@ const Handler = class { } get gitlab_accounts () { + const accounts = this._loadAndValidateAccounts() + + return accounts + } + + set gitlab_accounts (v) { + this._settings.set_string(GITLAB_ACCOUNTS, GLib.base64_encode(JSON.stringify(v))) + } + + connect (identifier, onChange) { + return this._settings.connect(identifier, onChange) + } + + disconnect (connectId) { + this._settings.disconnect(connectId) + } + + _loadAndValidateAccounts () { + let accounts = this._migrateAccountsFromSingleAccountStructure() + + if (isNullOrEmpty(accounts)) { + const rawString = this._settings.get_string(GITLAB_ACCOUNTS) + accounts = decodeBase64JsonOrDefault(rawString, []) + } + + return this._ensureHealthyGitlabAccountStructure(accounts) + } + + _migrateAccountsFromSingleAccountStructure () { /**** * For backwards compatiblity intercept here and check if old token exist * if we found old format convert to new format and save @@ -95,10 +125,11 @@ const Handler = class { const oldToken = this._settings.get_string(GITLAB_TOKEN) if (oldToken) { - const newData = [{ - ...DEFAULT_GITLAB_DATA, - token: oldToken - }] + const newData = [ + { + ...DEFAULT_GITLAB_DATA, + token: oldToken + }] this._settings.set_string(GITLAB_TOKEN, '') this._settings.set_string(GITLAB_ACCOUNTS, GLib.base64_encode(JSON.stringify(newData))) @@ -108,13 +139,23 @@ const Handler = class { } catch (e) { log(`failed to convert old token ${e}`) } - - const rawString = this._settings.get_string(GITLAB_ACCOUNTS) - return decodeBase64JsonOrDefault(rawString, []) } - connect (identifier, onChange) { - this._settings.connect(identifier, onChange) + _ensureHealthyGitlabAccountStructure (accounts) { + let normalizedAccounts = [] + + try { + normalizedAccounts = accounts.map(item => ({ + name: item.name || DEFAULT_GITLAB_DATA.name, + apiEndpoint: item.apiEndpoint || DEFAULT_GITLAB_DATA.apiEndpoint, + token: item.token || '', + onlyOwnedProjects: isNullOrUndefined(item.onlyOwnedProjects) ? DEFAULT_GITLAB_DATA.onlyOwnedProjects : item.onlyOwnedProjects + })) + } catch (e) { + log(`failed to normalize accounts data ${e}`) + } + + return normalizedAccounts } } diff --git a/gitlab-extension@infinicode.de/helpers/translations.js b/gitlab-extension@infinicode.de/helpers/translations.js index 0694df9..2e4efc4 100644 --- a/gitlab-extension@infinicode.de/helpers/translations.js +++ b/gitlab-extension@infinicode.de/helpers/translations.js @@ -21,7 +21,8 @@ var Translations = { SETTINGS: { ACCOUNT_NAME: _('Name'), TOKEN: _('Token'), - API_ENDPOINT: _('API Endpoint') + API_ENDPOINT: _('API Endpoint'), + ONLY_OWNED_PROJECTS: _('Only Owned Projects') } } @@ -33,7 +34,7 @@ var Translations = { * If @domain is not provided, it will be taken from metadata['gettext-domain'] */ var initTranslations = domain => { - if (ExtensionUtils.versionCheck(['3.32'], Config.PACKAGE_VERSION)) { + if (Config.PACKAGE_VERSION.startsWith('3.32')) { ExtensionUtils.initTranslations(domain) } else { const extension = ExtensionUtils.getCurrentExtension() diff --git a/gitlab-extension@infinicode.de/metadata.json b/gitlab-extension@infinicode.de/metadata.json index ddbafa5..c5b803a 100644 --- a/gitlab-extension@infinicode.de/metadata.json +++ b/gitlab-extension@infinicode.de/metadata.json @@ -5,9 +5,10 @@ "shell-version": [ "3.32", "3.36", - "3.38" + "3.38", + "40" ], "url": "https://github.com/cinatic/gitlab-extension", "uuid": "gitlab-extension@infinicode.de", - "version": 3 + "version": 4 } diff --git a/gitlab-extension@infinicode.de/po/de.po b/gitlab-extension@infinicode.de/po/de.po index d479aaf..72406ea 100644 --- a/gitlab-extension@infinicode.de/po/de.po +++ b/gitlab-extension@infinicode.de/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gnome-shell-extension-gitlab-extension\n" "Report-Msgid-Bugs-To: fh@infinicode.de\n" -"POT-Creation-Date: 2020-11-29 15:19+0100\n" +"POT-Creation-Date: 2021-04-16 20:25+0200\n" "PO-Revision-Date: 2020-11-29 15:22+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,104 +18,121 @@ msgstr "" "X-Generator: Poedit 2.4.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: gitlab-extension@infinicode.de/settings_40.ui:5 #: gitlab-extension@infinicode.de/settings.ui:7 msgid "Create GitLab Account" msgstr "GitLab Account erstellen" +#: gitlab-extension@infinicode.de/settings_40.ui:20 #: gitlab-extension@infinicode.de/settings.ui:28 #: gitlab-extension@infinicode.de/helpers/translations.js:22 msgid "Name" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:45 -#: gitlab-extension@infinicode.de/settings.ui:74 -#: gitlab-extension@infinicode.de/settings.ui:102 -#: gitlab-extension@infinicode.de/settings.ui:209 -#: gitlab-extension@infinicode.de/settings.ui:238 -#: gitlab-extension@infinicode.de/settings.ui:266 -msgid "Clear entry" -msgstr "Feld leeren" - +#: gitlab-extension@infinicode.de/settings_40.ui:32 +#: gitlab-extension@infinicode.de/settings_40.ui:154 #: gitlab-extension@infinicode.de/settings.ui:46 #: gitlab-extension@infinicode.de/settings.ui:210 msgid "gitlab.com" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:43 #: gitlab-extension@infinicode.de/settings.ui:59 #: gitlab-extension@infinicode.de/helpers/translations.js:23 msgid "Token" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:62 #: gitlab-extension@infinicode.de/settings.ui:86 #: gitlab-extension@infinicode.de/helpers/translations.js:24 msgid "API Endpoint" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:72 +#: gitlab-extension@infinicode.de/settings_40.ui:73 +#: gitlab-extension@infinicode.de/settings_40.ui:195 #: gitlab-extension@infinicode.de/settings.ui:98 #: gitlab-extension@infinicode.de/settings.ui:103 #: gitlab-extension@infinicode.de/settings.ui:267 msgid "https://gitlab.com/api/v4" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:88 +#: gitlab-extension@infinicode.de/settings_40.ui:221 #: gitlab-extension@infinicode.de/settings.ui:118 #: gitlab-extension@infinicode.de/settings.ui:294 msgid "Cancel" msgstr "Abbrechen" +#: gitlab-extension@infinicode.de/settings_40.ui:97 +#: gitlab-extension@infinicode.de/settings_40.ui:233 #: gitlab-extension@infinicode.de/settings.ui:133 #: gitlab-extension@infinicode.de/settings.ui:312 msgid "Save" msgstr "Speichern" +#: gitlab-extension@infinicode.de/settings_40.ui:127 #: gitlab-extension@infinicode.de/settings.ui:171 msgid "Edit GitLab Account" msgstr "Account bearbeiten" +#: gitlab-extension@infinicode.de/settings_40.ui:142 #: gitlab-extension@infinicode.de/settings.ui:192 msgid "Edit name" msgstr "Name bearbeiten" +#: gitlab-extension@infinicode.de/settings_40.ui:165 #: gitlab-extension@infinicode.de/settings.ui:223 msgid "Edit Token" msgstr "Token bearbeiten" +#: gitlab-extension@infinicode.de/settings_40.ui:185 #: gitlab-extension@infinicode.de/settings.ui:251 msgid "Edit API Endpoint" msgstr "API Endpoint bearbeiten" -#: gitlab-extension@infinicode.de/settings.ui:456 +#: gitlab-extension@infinicode.de/settings_40.ui:334 +#: gitlab-extension@infinicode.de/settings.ui:455 msgid "Accounts" msgstr "Zugänge" -#: gitlab-extension@infinicode.de/settings.ui:478 +#: gitlab-extension@infinicode.de/settings_40.ui:358 +#: gitlab-extension@infinicode.de/settings.ui:477 msgid "Position in Panel" msgstr "Position im Panel" +#: gitlab-extension@infinicode.de/settings_40.ui:370 +#: gitlab-extension@infinicode.de/settings.ui:490 +msgid "Left" +msgstr "Links" + +#: gitlab-extension@infinicode.de/settings_40.ui:371 #: gitlab-extension@infinicode.de/settings.ui:491 msgid "Center" msgstr "Zentriert" +#: gitlab-extension@infinicode.de/settings_40.ui:372 #: gitlab-extension@infinicode.de/settings.ui:492 msgid "Right" msgstr "Rechts" -#: gitlab-extension@infinicode.de/settings.ui:493 -msgid "Left" -msgstr "Links" - -#: gitlab-extension@infinicode.de/settings.ui:531 +#: gitlab-extension@infinicode.de/settings_40.ui:406 +#: gitlab-extension@infinicode.de/settings.ui:530 msgid "Layout" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:570 +#: gitlab-extension@infinicode.de/settings_40.ui:441 +#: gitlab-extension@infinicode.de/settings.ui:569 msgid "Version: " msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:584 +#: gitlab-extension@infinicode.de/settings_40.ui:448 +#: gitlab-extension@infinicode.de/settings.ui:583 msgid "unknown (self-build ?)" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:604 +#: gitlab-extension@infinicode.de/settings_40.ui:457 +#: gitlab-extension@infinicode.de/settings.ui:603 msgid "" "GitLab will provide you a couple of information about your projects " "and pipelines. It utilizes the official " msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:627 +#: gitlab-extension@infinicode.de/settings_40.ui:473 +#: gitlab-extension@infinicode.de/settings.ui:626 msgid "Maintained by" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:678 +#: gitlab-extension@infinicode.de/settings_40.ui:497 +#: gitlab-extension@infinicode.de/settings.ui:677 msgid "" "This program comes with ABSOLUTELY NO WARRANTY.\n" "See the GNU General Public " "License, version 3 or later for details." msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:699 +#: gitlab-extension@infinicode.de/settings_40.ui:509 +#: gitlab-extension@infinicode.de/settings.ui:698 msgid "About" msgstr "" +#: gitlab-extension@infinicode.de/settings.ui:45 +#: gitlab-extension@infinicode.de/settings.ui:74 +#: gitlab-extension@infinicode.de/settings.ui:102 +#: gitlab-extension@infinicode.de/settings.ui:209 +#: gitlab-extension@infinicode.de/settings.ui:238 +#: gitlab-extension@infinicode.de/settings.ui:266 +msgid "Clear entry" +msgstr "Feld leeren" + #: gitlab-extension@infinicode.de/helpers/translations.js:11 msgid "back" msgstr "zurück" @@ -179,3 +208,7 @@ msgid "" msgstr "" "Daten können ohne Token nicht geladen werden. Füge in den Einstellungen " "mindestens einen Account hinzu." + +#: gitlab-extension@infinicode.de/helpers/translations.js:25 +msgid "Only Owned Projects" +msgstr "" diff --git a/gitlab-extension@infinicode.de/po/gitlab-extension@infinicode.de.pot b/gitlab-extension@infinicode.de/po/gitlab-extension@infinicode.de.pot index c4e3586..7ebd339 100644 --- a/gitlab-extension@infinicode.de/po/gitlab-extension@infinicode.de.pot +++ b/gitlab-extension@infinicode.de/po/gitlab-extension@infinicode.de.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gnome-shell-extension-gitlab-extension\n" "Report-Msgid-Bugs-To: fh@infinicode.de\n" -"POT-Creation-Date: 2020-11-29 16:42+0100\n" +"POT-Creation-Date: 2021-04-16 20:25+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,104 +17,121 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: gitlab-extension@infinicode.de/settings_40.ui:5 #: gitlab-extension@infinicode.de/settings.ui:7 msgid "Create GitLab Account" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:20 #: gitlab-extension@infinicode.de/settings.ui:28 #: gitlab-extension@infinicode.de/helpers/translations.js:22 msgid "Name" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:45 -#: gitlab-extension@infinicode.de/settings.ui:74 -#: gitlab-extension@infinicode.de/settings.ui:102 -#: gitlab-extension@infinicode.de/settings.ui:209 -#: gitlab-extension@infinicode.de/settings.ui:238 -#: gitlab-extension@infinicode.de/settings.ui:266 -msgid "Clear entry" -msgstr "" - +#: gitlab-extension@infinicode.de/settings_40.ui:32 +#: gitlab-extension@infinicode.de/settings_40.ui:154 #: gitlab-extension@infinicode.de/settings.ui:46 #: gitlab-extension@infinicode.de/settings.ui:210 msgid "gitlab.com" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:43 #: gitlab-extension@infinicode.de/settings.ui:59 #: gitlab-extension@infinicode.de/helpers/translations.js:23 msgid "Token" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:62 #: gitlab-extension@infinicode.de/settings.ui:86 #: gitlab-extension@infinicode.de/helpers/translations.js:24 msgid "API Endpoint" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:72 +#: gitlab-extension@infinicode.de/settings_40.ui:73 +#: gitlab-extension@infinicode.de/settings_40.ui:195 #: gitlab-extension@infinicode.de/settings.ui:98 #: gitlab-extension@infinicode.de/settings.ui:103 #: gitlab-extension@infinicode.de/settings.ui:267 msgid "https://gitlab.com/api/v4" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:88 +#: gitlab-extension@infinicode.de/settings_40.ui:221 #: gitlab-extension@infinicode.de/settings.ui:118 #: gitlab-extension@infinicode.de/settings.ui:294 msgid "Cancel" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:97 +#: gitlab-extension@infinicode.de/settings_40.ui:233 #: gitlab-extension@infinicode.de/settings.ui:133 #: gitlab-extension@infinicode.de/settings.ui:312 msgid "Save" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:127 #: gitlab-extension@infinicode.de/settings.ui:171 msgid "Edit GitLab Account" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:142 #: gitlab-extension@infinicode.de/settings.ui:192 msgid "Edit name" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:165 #: gitlab-extension@infinicode.de/settings.ui:223 msgid "Edit Token" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:185 #: gitlab-extension@infinicode.de/settings.ui:251 msgid "Edit API Endpoint" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:456 +#: gitlab-extension@infinicode.de/settings_40.ui:334 +#: gitlab-extension@infinicode.de/settings.ui:455 msgid "Accounts" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:478 +#: gitlab-extension@infinicode.de/settings_40.ui:358 +#: gitlab-extension@infinicode.de/settings.ui:477 msgid "Position in Panel" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:370 +#: gitlab-extension@infinicode.de/settings.ui:490 +msgid "Left" +msgstr "" + +#: gitlab-extension@infinicode.de/settings_40.ui:371 #: gitlab-extension@infinicode.de/settings.ui:491 msgid "Center" msgstr "" +#: gitlab-extension@infinicode.de/settings_40.ui:372 #: gitlab-extension@infinicode.de/settings.ui:492 msgid "Right" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:493 -msgid "Left" -msgstr "" - -#: gitlab-extension@infinicode.de/settings.ui:531 +#: gitlab-extension@infinicode.de/settings_40.ui:406 +#: gitlab-extension@infinicode.de/settings.ui:530 msgid "Layout" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:570 +#: gitlab-extension@infinicode.de/settings_40.ui:441 +#: gitlab-extension@infinicode.de/settings.ui:569 msgid "Version: " msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:584 +#: gitlab-extension@infinicode.de/settings_40.ui:448 +#: gitlab-extension@infinicode.de/settings.ui:583 msgid "unknown (self-build ?)" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:604 +#: gitlab-extension@infinicode.de/settings_40.ui:457 +#: gitlab-extension@infinicode.de/settings.ui:603 msgid "" "GitLab will provide you a couple of information about your projects " "and pipelines. It utilizes the official " msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:627 +#: gitlab-extension@infinicode.de/settings_40.ui:473 +#: gitlab-extension@infinicode.de/settings.ui:626 msgid "Maintained by" msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:678 +#: gitlab-extension@infinicode.de/settings_40.ui:497 +#: gitlab-extension@infinicode.de/settings.ui:677 msgid "" "This program comes with ABSOLUTELY NO WARRANTY.\n" "See the GNU General Public " "License, version 3 or later for details." msgstr "" -#: gitlab-extension@infinicode.de/settings.ui:699 +#: gitlab-extension@infinicode.de/settings_40.ui:509 +#: gitlab-extension@infinicode.de/settings.ui:698 msgid "About" msgstr "" +#: gitlab-extension@infinicode.de/settings.ui:45 +#: gitlab-extension@infinicode.de/settings.ui:74 +#: gitlab-extension@infinicode.de/settings.ui:102 +#: gitlab-extension@infinicode.de/settings.ui:209 +#: gitlab-extension@infinicode.de/settings.ui:238 +#: gitlab-extension@infinicode.de/settings.ui:266 +msgid "Clear entry" +msgstr "" + #: gitlab-extension@infinicode.de/helpers/translations.js:11 msgid "back" msgstr "" @@ -176,3 +205,7 @@ msgid "" "No accounts configured. Please open settings and add at least one gitlab " "account." msgstr "" + +#: gitlab-extension@infinicode.de/helpers/translations.js:25 +msgid "Only Owned Projects" +msgstr "" diff --git a/gitlab-extension@infinicode.de/prefs.js b/gitlab-extension@infinicode.de/prefs.js index 19e960c..c1625bb 100644 --- a/gitlab-extension@infinicode.de/prefs.js +++ b/gitlab-extension@infinicode.de/prefs.js @@ -1,24 +1,14 @@ -const { GLib, Gtk, GObject } = imports.gi +const { Gio, Gtk, GObject } = imports.gi -const Mainloop = imports.mainloop +const Config = imports.misc.config const ExtensionUtils = imports.misc.extensionUtils const Me = ExtensionUtils.getCurrentExtension() -const { decodeBase64JsonOrDefault } = Me.imports.helpers.data -const Settings = Me.imports.helpers.settings +const { getSettings, Settings } = Me.imports.helpers.settings const { initTranslations, Translations } = Me.imports.helpers.translations const EXTENSIONDIR = Me.dir.get_path() -const POSITION_IN_PANEL_KEY = 'position-in-panel' -const GITLAB_TOKEN = 'gitlab-token' -const GITLAB_ACCOUNTS = 'gitlab-accounts' - -let inRealize = false - -let defaultSize = [-1, -1] - -let i = 0 var PrefsWidget = GObject.registerClass({ GTypeName: 'GitLabExtensionPrefsWidget' }, class Widget extends Gtk.Box { @@ -29,134 +19,75 @@ var PrefsWidget = GObject.registerClass({ spacing: 0 })) - this.configWidgets = [] this.Window = new Gtk.Builder() + this.loadConfig() this.initWindow() - defaultSize = this.MainWidget.get_size_request() - let borderWidth = this.MainWidget.get_border_width() + if (isGnome4()) { + this.append(this.MainWidget) + } else { + this.add(this.MainWidget) + } + } + + initWindow () { + let uiFile = EXTENSIONDIR + '/settings.ui' - defaultSize[0] += 2 * borderWidth - defaultSize[1] += 2 * borderWidth + if (isGnome4()) { + uiFile = EXTENSIONDIR + '/settings_40.ui' + } - this.MainWidget.set_size_request(-1, -1) - this.MainWidget.set_border_width(0) + this.Window.add_from_file(uiFile) + this.MainWidget = this.Window.get_object('main-widget') - this.evaluateValues() + const gtkConfigObjects = this.Window.get_objects() - this.add(this.MainWidget) + gtkConfigObjects.forEach(gtkWidget => { + const gtkUiIdentifier = getWidgetUiIdentifier(gtkWidget) + const widgetType = getWidgetType(gtkWidget) - this.MainWidget.connect('realize', () => { - if (inRealize) { + if (gtkUiIdentifier && (gtkUiIdentifier.startsWith('new-') || gtkUiIdentifier.startsWith('edit-'))) { return } - inRealize = true - this.MainWidget.get_toplevel().resize(defaultSize[0], defaultSize[1]) - inRealize = false - }) - } + switch (widgetType) { + case 'GtkComboBoxText': + this.initComboBox(gtkWidget, gtkUiIdentifier) + break - initWindow () { - this.Window.add_from_file(EXTENSIONDIR + '/settings.ui') + case 'GtkSwitch': + this.initSwitch(gtkWidget, gtkUiIdentifier) + break - this.MainWidget = this.Window.get_object('main-widget') - - let theObjects = this.Window.get_objects() - for (let i in theObjects) { - let name = theObjects[i].get_name ? theObjects[i].get_name() : 'dummy' - - if (this[name] !== undefined) { - if (theObjects[i].class_path()[1].indexOf('GtkEntry') != -1) { - this.initEntry(theObjects[i]) - } else if (theObjects[i].class_path()[1].indexOf('GtkComboBoxText') != -1) { - this.initComboBox(theObjects[i]) - } else if (theObjects[i].class_path()[1].indexOf('GtkSwitch') != -1) { - this.initSwitch(theObjects[i]) - } else if (theObjects[i].class_path()[1].indexOf('GtkScale') != -1) { - this.initScale(theObjects[i]) - } - - this.configWidgets.push([theObjects[i], name]) + case 'GtkSpinButton': + this.initSpinner(gtkWidget, gtkUiIdentifier) + break } - } + }) if (Me.metadata.version !== undefined) { this.Window.get_object('version').set_label(Me.metadata.version.toString()) } this._initTreeView() + this.recreateTreeViewColumns() } - clearEntry () { - arguments[0].set_text('') - } - - initEntry (theEntry) { - let name = theEntry.get_name() - theEntry.text = this[name] - if (this[name].length != 32) { - theEntry.set_icon_from_icon_name(Gtk.PositionType.LEFT, 'dialog-warning') - } - - theEntry.connect('notify::text', () => { - let key = arguments[0].text - this[name] = key - if (key.length == 32) { - theEntry.set_icon_from_icon_name(Gtk.PositionType.LEFT, '') - } else { - theEntry.set_icon_from_icon_name(Gtk.PositionType.LEFT, 'dialog-warning') - } - }) - } - - initComboBox (theComboBox) { - let name = theComboBox.get_name() - theComboBox.connect('changed', () => - this[name] = arguments[0].active - ) + loadConfig () { + this.Settings = getSettings() } - initSwitch (theSwitch) { - let name = theSwitch.get_name() - - theSwitch.connect('notify::active', () => - this[name] = arguments[0].active - ) + initSpinner (gtkWidget, identifier) { + this.Settings.bind(identifier, gtkWidget, 'value', Gio.SettingsBindFlags.DEFAULT) } - initScale (theScale) { - let name = theScale.get_name() - theScale.set_value(this[name]) - this[name + 'Timeout'] = undefined - theScale.connect('value-changed', (slider) => { - if (this[name + 'Timeout'] !== undefined) { - Mainloop.source_remove(this[name + 'Timeout']) - } - this[name + 'Timeout'] = Mainloop.timeout_add(250, () => { - this[name] = slider.get_value() - return false - }) - }) + initComboBox (gtkWidget, identifier) { + this.Settings.bind(identifier, gtkWidget, 'active-id', Gio.SettingsBindFlags.DEFAULT) } - loadConfig () { - this.Settings = Settings.getSettings() - this.Settings.connect('changed', this.evaluateValues.bind(this)) - } - - evaluateValues () { - this.recreateTreeViewColumns() - - const config = this.configWidgets - - for (let i in config) { - - if (config[i][0].active != this[config[i][1]]) { - config[i][0].active = this[config[i][1]] - } - } + initSwitch (gtkWidget, identifier) { + this.Settings.bind(identifier, gtkWidget, 'active', Gio.SettingsBindFlags.DEFAULT) } _initTreeView () { @@ -175,7 +106,7 @@ var PrefsWidget = GObject.registerClass({ // TreeView / Table Buttons this.Window.get_object('tree-toolbutton-add').connect('clicked', () => { - this.createGitLabAccountWidget.show_all() + this.createGitLabAccountWidget.show() }) this.Window.get_object('tree-toolbutton-remove').connect('clicked', this.removeGitLabAccountItem.bind(this)) @@ -209,6 +140,36 @@ var PrefsWidget = GObject.registerClass({ cell.markup = model.get_value(iter, 0) }) + /**** only owned projects cell ****/ + const toggleRenderer = new Gtk.CellRendererToggle() + toggleRenderer.set_activatable(true) + + toggleRenderer.connect('toggled', (cell, path) => { + const treePath = Gtk.TreePath.new_from_string(path) + const itemIndex = treePath.get_indices()[0] + + const accounts = Settings.gitlab_accounts + const toggledItem = accounts[itemIndex] + + toggledItem.onlyOwnedProjects = !toggledItem.onlyOwnedProjects + + accounts[itemIndex] = toggledItem + + Settings.gitlab_accounts = accounts + + this.recreateTreeViewColumns() + }) + + const onlyOwnedProjectsColumn = new Gtk.TreeViewColumn() + onlyOwnedProjectsColumn.set_title(Translations.SETTINGS.ONLY_OWNED_PROJECTS) + this.treeview.append_column(onlyOwnedProjectsColumn) + + onlyOwnedProjectsColumn.pack_start(toggleRenderer, null) + + onlyOwnedProjectsColumn.set_cell_data_func(toggleRenderer, function (tree, cell, model, iter) { + cell.active = model.get_value(iter, 1) + }) + /**** token cell ****/ const tokenColumn = new Gtk.TreeViewColumn() tokenColumn.set_title(Translations.SETTINGS.TOKEN) @@ -217,7 +178,7 @@ var PrefsWidget = GObject.registerClass({ tokenColumn.pack_start(renderer, null) tokenColumn.set_cell_data_func(renderer, (tree, cell, model, iter) => { - cell.markup = model.get_value(iter, 1) + cell.markup = model.get_value(iter, 2) }) /**** api-endpoint cell ****/ @@ -228,7 +189,7 @@ var PrefsWidget = GObject.registerClass({ apiEndpointColumn.pack_start(renderer, null) apiEndpointColumn.set_cell_data_func(renderer, function (tree, cell, model, iter) { - cell.markup = model.get_value(iter, 2) + cell.markup = model.get_value(iter, 3) }) } @@ -236,7 +197,7 @@ var PrefsWidget = GObject.registerClass({ * this recreates the TreeView (Symbol Table) */ recreateTreeViewColumns () { - const gitlabAccounts = this.gitlabAccounts + const gitlabAccounts = Settings.gitlab_accounts this.treeview = this.Window.get_object('tree-treeview') this.liststore = this.Window.get_object('tree-liststore') @@ -256,8 +217,9 @@ var PrefsWidget = GObject.registerClass({ current = this.liststore.append() this.liststore.set_value(current, 0, accountItem.name) - this.liststore.set_value(current, 1, accountItem.token) - this.liststore.set_value(current, 2, accountItem.apiEndpoint) + this.liststore.set_value(current, 1, accountItem.onlyOwnedProjects) + this.liststore.set_value(current, 2, accountItem.token) + this.liststore.set_value(current, 3, accountItem.apiEndpoint) }) } } @@ -275,7 +237,7 @@ var PrefsWidget = GObject.registerClass({ // check if we have data (normally we should otherwise it could not be selected...) const selectionIndex = parseInt(selection[0][0].to_string()) - const selectedItem = this.gitlabAccounts[selectionIndex] + const selectedItem = Settings.gitlab_accounts[selectionIndex] if (!selectedItem) { return @@ -285,7 +247,7 @@ var PrefsWidget = GObject.registerClass({ this.editAccountTokenInput.set_text(selectedItem.token) this.editAccountApiEndpointInput.set_text(selectedItem.apiEndpoint) - this.editGitLabAccountWidget.show_all() + this.editGitLabAccountWidget.show() } /** @@ -303,7 +265,9 @@ var PrefsWidget = GObject.registerClass({ } // append new item and write it to config - this.gitlabAccounts = [...this.gitlabAccounts, newItem] + Settings.gitlab_accounts = [...Settings.gitlab_accounts, newItem] + + this.recreateTreeViewColumns() this.createGitLabAccountWidget.hide() } @@ -319,7 +283,7 @@ var PrefsWidget = GObject.registerClass({ return } - const gitlabAccounts = this.gitlabAccounts + const gitlabAccounts = Settings.gitlab_accounts const selectionIndex = parseInt(selection[0][0].to_string()) const selectedItem = gitlabAccounts[selectionIndex] @@ -338,7 +302,9 @@ var PrefsWidget = GObject.registerClass({ } gitlabAccounts[selectionIndex] = newItem - this.gitlabAccounts = gitlabAccounts + Settings.gitlab_accounts = gitlabAccounts + + this.recreateTreeViewColumns() this.editGitLabAccountWidget.hide() } @@ -354,7 +320,7 @@ var PrefsWidget = GObject.registerClass({ return } - const gitlabAccounts = this.gitlabAccounts + const gitlabAccounts = Settings.gitlab_accounts const selectionIndex = parseInt(selection[0][0].to_string()) const selectedItem = gitlabAccounts[selectionIndex] @@ -364,65 +330,37 @@ var PrefsWidget = GObject.registerClass({ gitlabAccounts.splice(selectionIndex, 1) - this.gitlabAccounts = gitlabAccounts - } + Settings.gitlab_accounts = gitlabAccounts - // The names must be equal to the ID in settings.ui! - get position_in_panel () { - if (!this.Settings) { - this.loadConfig() - } - return this.Settings.get_enum(POSITION_IN_PANEL_KEY) + this.recreateTreeViewColumns() } +}) - set position_in_panel (v) { - if (!this.Settings) { - this.loadConfig() - } - - this.Settings.set_enum(POSITION_IN_PANEL_KEY, v) +const getWidgetUiIdentifier = gtkWidget => { + if (isGnome4()) { + return gtkWidget.get_buildable_id ? gtkWidget.get_buildable_id() : null } - get gitlabAccounts () { - if (!this.Settings) { - this.loadConfig() - } - - /**** - * For backwards compatiblity intercept here and check if old token exist - * if we found old format convert to new format and save - */ - try { - const oldToken = this.Settings.get_string(GITLAB_TOKEN) - - if (oldToken) { - const newData = [ - { - ...Settings.DEFAULT_GITLAB_DATA, - token: oldToken - }] - - this.Settings.set_string(GITLAB_TOKEN, '') - this.Settings.set_string(GITLAB_ACCOUNTS, GLib.base64_encode(JSON.stringify(newData))) - - return newData - } - } catch (e) { - log(`failed to convert old token ${e}`) - } + return gtkWidget.get_name ? gtkWidget.get_name() : null +} - const rawString = this.Settings.get_string(GITLAB_ACCOUNTS) - return decodeBase64JsonOrDefault(rawString, []) +const getWidgetType = gtkWidget => { + if (isGnome4()) { + return gtkWidget.get_name ? gtkWidget.get_name() : null } - set gitlabAccounts (v) { - if (!this.Settings) { - this.loadConfig() - } + const classPaths = gtkWidget.class_path ? gtkWidget.class_path()[1] : [] - this.Settings.set_string(GITLAB_ACCOUNTS, GLib.base64_encode(JSON.stringify(v))) + if (classPaths.indexOf('GtkSwitch') !== -1) { + return 'GtkSwitch' + } else if (classPaths.indexOf('GtkComboBoxText') !== -1) { + return 'GtkComboBoxText' + } else if (classPaths.indexOf('GtkSpinButton') !== -1) { + return 'GtkSpinButton' } -}) +} + +const isGnome4 = () => Config.PACKAGE_VERSION.startsWith('4') // this is called when settings has been opened var init = () => { @@ -431,6 +369,6 @@ var init = () => { function buildPrefsWidget () { let widget = new PrefsWidget() - widget.show_all() + widget.show() return widget } diff --git a/gitlab-extension@infinicode.de/services/gitlab.js b/gitlab-extension@infinicode.de/services/gitlab.js index efcd8c9..4d3074c 100644 --- a/gitlab-extension@infinicode.de/services/gitlab.js +++ b/gitlab-extension@infinicode.de/services/gitlab.js @@ -10,11 +10,11 @@ const headers = token => ({ }) var getOwnedProjects = async ({ per_page }) => { - const { name: accountName, apiEndpoint, token } = Settings.selected_gitlab_account || {} + const { name: accountName, apiEndpoint, token, onlyOwnedProjects } = Settings.selected_gitlab_account || {} return cacheOrDefault(`projects_${apiEndpoint}_${accountName}`, () => { const queryParameters = { - owned: 0, + owned: onlyOwnedProjects, order_by: 'last_activity_at', per_page } diff --git a/gitlab-extension@infinicode.de/settings.ui b/gitlab-extension@infinicode.de/settings.ui index d6cd1a3..3dbd193 100644 --- a/gitlab-extension@infinicode.de/settings.ui +++ b/gitlab-extension@infinicode.de/settings.ui @@ -332,18 +332,17 @@ - - + - gitlab.com - Token - https://gitlab.com/api/v4 + False + Token + https://gitlab.com/api/v4 @@ -352,7 +351,7 @@ 480 True True - 20 + 0 True @@ -483,14 +482,14 @@ - + True False end - Center - Right - Left + Left + Center + Right diff --git a/gitlab-extension@infinicode.de/settings_40.ui b/gitlab-extension@infinicode.de/settings_40.ui new file mode 100644 index 0000000..04ddcca --- /dev/null +++ b/gitlab-extension@infinicode.de/settings_40.ui @@ -0,0 +1,519 @@ + + + + + Create GitLab Account + 1 + 1 + + + vertical + 5 + 20 + 20 + 20 + 20 + + + start + 1 + Name + end + + 0 + 0 + + + + + + 350 + 1 + gitlab.com + + 0 + 1 + + + + + + start + 1 + Token + + 0 + 2 + + + + + + 1 + + 0 + 3 + + + + + + start + API Endpoint + + 0 + 4 + + + + + + 1 + https://gitlab.com/api/v4 + https://gitlab.com/api/v4 + + 0 + 5 + + + + + + 0 + baseline + 0 + 1 + + + Cancel + 1 + left + 1 + 15 + + + + + Save + 1 + 1 + 15 + + + + + + + 0 + 7 + + + + + + 0 + 5 + 5 + + 0 + 6 + + + + + + + + Edit GitLab Account + 1 + 1 + + + vertical + 5 + 20 + 20 + 20 + 20 + + + start + 1 + Edit name + end + + 0 + 0 + + + + + + 350 + 1 + gitlab.com + + 0 + 1 + + + + + + start + 1 + Edit Token + + 0 + 2 + + + + + + 1 + + 0 + 3 + + + + + + start + 1 + Edit API Endpoint + + 0 + 4 + + + + + + 1 + https://gitlab.com/api/v4 + + 0 + 5 + + + + + + 0 + 5 + 5 + + 0 + 6 + + + + + + 0 + baseline + 0 + 1 + + + Cancel + 1 + left + 1 + 15 + + + + + + + + Save + 1 + 1 + 15 + + + + 0 + 7 + + + + + + + + + + + + + + + + gitlab.com + False + Token + https://gitlab.com/api/v4 + + + + + 500 + 480 + + + 0 + natural + natural + + + 1 + + + + + 0 + 1 + 1 + vertical + + + 1 + 300 + 250 + + + tree-liststore + 1 + 0 + 0 + 12 + 1 + + + + + + + + + + + 0 + + + 0 + list-add + + + + + 0 + list-remove + + + + + 0 + document-edit + + + + + + + + + 0 + Accounts + + + + + + + 1 + + + 0 + 1 + 1 + 5 + 5 + 20 + 20 + 20 + 20 + + + 0 + start + 1 + Position in Panel + + 0 + 0 + + + + + + 0 + end + + Left + Center + Right + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + Layout + + + + + + + 5 + + + 1 + 0 + 20 + 20 + 20 + 20 + 1 + 1 + vertical + 5 + + + 0 + <b>GitLab</b> + 1 + + + + + 0 + center + + + 0 + end + Version: + + + + + 0 + start + unknown (self-build ?) + end + + + + + + + 0 + <span>GitLab will provide you a couple of information about your projects and pipelines. It utilizes the official <a href="https://docs.gitlab.com/ee/api/">GitLab API v4</a>. The plan is to have a quick and convenient control over the latest builds and commits.</span> + 1 + center + 1 + word-char + 1 + + + + + 0 + center + 5 + + + 0 + Maintained by + + + + + Florijan Hamzic (<a href="mailto:fh@infinicode.de">fh@infinicode.de</a>) + 1 + + + + + + + https://github.com/cinatic/gitlab-extension + 1 + 0.9999999997764826 + center + https://github.com/cinatic/gitlab-extension + + + + + 1 + end + <span size="small">This program comes with ABSOLUTELY NO WARRANTY. +See the <a href="https://www.gnu.org/licenses/gpl">GNU General Public License, version 3 or later</a> for details.</span> + 1 + center + 1 + + + + + + + 0 + About + + + + + + + + + +