From 301d58686dffc73a634266c087a74b8ea0786462 Mon Sep 17 00:00:00 2001 From: Keith Rocheck <749812+krocheck@users.noreply.github.com> Date: Tue, 15 Oct 2024 23:27:32 -0400 Subject: [PATCH 1/2] feat: add userconfig to import-export --- companion/lib/Data/ImportExport.ts | 10 ++++++++++ companion/lib/Data/UserConfig.ts | 16 ++++++++++++++++ shared-lib/lib/Model/ExportModel.ts | 3 ++- shared-lib/lib/Model/ImportExport.ts | 3 +++ webui/src/ImportExport/Export.tsx | 10 +++++----- webui/src/ImportExport/Import/Full.tsx | 6 +++--- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/companion/lib/Data/ImportExport.ts b/companion/lib/Data/ImportExport.ts index d1e1109ba2..7fe73bbec3 100644 --- a/companion/lib/Data/ImportExport.ts +++ b/companion/lib/Data/ImportExport.ts @@ -344,6 +344,10 @@ export class DataImportExport extends CoreBase { exp.surfaceGroups = this.surfaces.exportAllGroups(false) } + if (!config || !isFalsey(config.userconfig)) { + exp.userconfig = this.userconfig.getAll(false) + } + return exp } @@ -548,6 +552,7 @@ export class DataImportExport extends CoreBase { customVariables: 'custom_variables' in object, surfaces: 'surfaces' in object, triggers: 'triggers' in object, + userconfig: 'userconfig' in object, } for (const [instanceId, instance] of Object.entries(object.instances || {})) { @@ -634,6 +639,11 @@ export class DataImportExport extends CoreBase { // Destroy old stuff await this.#reset(undefined, !config || config.buttons) + // import userconfig + if (!config || config.userconfig) { + this.userconfig.setKeys(data.userconfig || {}) + } + // import custom variables if (!config || config.customVariables) { this.variablesController.custom.replaceDefinitions(data.custom_variables || {}) diff --git a/companion/lib/Data/UserConfig.ts b/companion/lib/Data/UserConfig.ts index edf27de347..d3b61ee869 100644 --- a/companion/lib/Data/UserConfig.ts +++ b/companion/lib/Data/UserConfig.ts @@ -276,6 +276,22 @@ export class DataUserConfig extends CoreBase { }) } + /** + * Get the config settings + * @param {boolean} [clone = false] - true if a clone is needed instead of a link + * @returns {UserConfigModel} the config values + * @access public + */ + getAll(clone = false): UserConfigModel { + let out = this.#data + + if (clone === true) { + out = cloneDeep(out) + } + + return out + } + /** * Get a specific use config setting * @param key diff --git a/shared-lib/lib/Model/ExportModel.ts b/shared-lib/lib/Model/ExportModel.ts index 1ce5f7cc91..9770a41d9d 100644 --- a/shared-lib/lib/Model/ExportModel.ts +++ b/shared-lib/lib/Model/ExportModel.ts @@ -1,4 +1,4 @@ -import type { UserConfigGridSize } from './UserConfigModel.js' +import type { UserConfigGridSize, UserConfigModel } from './UserConfigModel.js' import type { ConnectionConfig } from './Connections.js' import type { CustomVariablesModel } from './CustomVariableModel.js' @@ -16,6 +16,7 @@ export interface ExportFullv4 extends ExportBase<'full'> { instances?: ExportInstancesv4 surfaces?: unknown surfaceGroups?: unknown + userconfig?: UserConfigModel } export interface ExportPageModelv4 extends ExportBase<'page'> { diff --git a/shared-lib/lib/Model/ImportExport.ts b/shared-lib/lib/Model/ImportExport.ts index abc305f9ad..0f33e6f4fd 100644 --- a/shared-lib/lib/Model/ImportExport.ts +++ b/shared-lib/lib/Model/ImportExport.ts @@ -16,6 +16,7 @@ export interface ClientExportSelection { customVariables: boolean connections: boolean surfaces: boolean + userconfig: boolean format: ExportFormat } @@ -25,6 +26,7 @@ export interface ClientImportSelection { customVariables: boolean surfaces: boolean triggers: boolean + userconfig: boolean } export interface ClientPageInfo { @@ -43,6 +45,7 @@ export interface ClientImportObject { customVariables: boolean surfaces: boolean triggers: boolean | Record + userconfig: boolean oldPageNumber?: number page?: ClientPageInfo pages?: Record diff --git a/webui/src/ImportExport/Export.tsx b/webui/src/ImportExport/Export.tsx index a20d50b955..d60a83eb9d 100644 --- a/webui/src/ImportExport/Export.tsx +++ b/webui/src/ImportExport/Export.tsx @@ -19,7 +19,7 @@ export const ExportWizardModal = forwardRef - {/*
+
setValue('userconfig', e.currentTarget.checked)} - label='Settings' + label="Settings" /> -
*/} +
setValue('format', val)} label="File format" /> diff --git a/webui/src/ImportExport/Import/Full.tsx b/webui/src/ImportExport/Import/Full.tsx index a7a63faab3..62faa5f907 100644 --- a/webui/src/ImportExport/Import/Full.tsx +++ b/webui/src/ImportExport/Import/Full.tsx @@ -134,7 +134,7 @@ function FullImportTab({ snapshot }: FullImportTabProps) { surfaces: true, triggers: true, customVariables: true, - // userconfig: true, + userconfig: true, })) const validConfigKeys = Object.entries(config).filter(([k, v]) => v && snapshotKeys.includes(k)) @@ -206,13 +206,13 @@ function FullImportTab({ snapshot }: FullImportTabProps) { - {/* */} + /> All the connections will be imported, as they are required to be able to import any actions and feedbacks. From a84138b2e1c2e8cf56838bb90d10b1d063582759 Mon Sep 17 00:00:00 2001 From: Julian Waller Date: Sat, 16 Nov 2024 00:03:49 +0000 Subject: [PATCH 2/2] fix: checkbox indeterminate styling --- webui/public/img/check.png | Bin 15401 -> 0 bytes webui/public/img/check.svg | 7 +++++++ webui/public/img/indeterminate.svg | 5 +++++ webui/src/scss/_controls.scss | 11 ++++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) delete mode 100755 webui/public/img/check.png create mode 100644 webui/public/img/check.svg create mode 100644 webui/public/img/indeterminate.svg diff --git a/webui/public/img/check.png b/webui/public/img/check.png deleted file mode 100755 index 99111076f702e62276bb450e72da19b199539206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15401 zcmeI3e{37&8OJY8yR>Q3G8I9UX{}{M7L=Xu&OY0@o9#5UTav0Sk(+K#J7~{$uj3>3 zo$I^Aj_I_pF-kRoSb>2MNFYG0gLSRe4!WYTu46ycML`4ct5l)m4@x%;N~D#wTiJX5 zd3oc!iUiaCc`ey@&-;C!=ehg5@ALTnx%~rMZ*FUCZ>1=zt-mi4gU4&F@6s>9-+T9e zwGAGYW&4H)Z5D*UGO@l<FFPHo5_Epc8)c)}Fi5F=#T?jH+&U;1M`S^9_Jmpk1rY|w08?@lGHJ~a z3qfZot_aVqVaDkwO)*D;&R#2_BOV=ag!LS7cwIhP<~-dFzu@A$Lbsd$y2H(KK86(- zj;C2pWCfAs9F>nV)C$i6IVCB^BAY7dpcQncOfxGoOg^7?fs;)V#xKctNHG@v4m8kZq+*c-BOQabUc90@dkg^Qt zVwpxxid^%_j^@&(OH*V9q(KH~rUCu9hJM+UZt6x#pC@Hao;NXElW4S-yW#a_G7VE3 z=EgCIpn|lar!hF51xySW`e;rD8^_?S+|cOmO*L6xoLP}9W!`HC1$7=bODVgRwnBM@ z0`OkNa1KbOo*UHlbf~<`2C4`h;jp!<{Ep73B&(Xm^`-!WI@MRa9uGt$6NI2|H_du! zw|~&hiEg*Zdb?Qo%i4mJXCg78x}qk>8^z#7)^Cqtn~BDN6{JX}w4f;VxwbfpEGG3_ zMlwTcMj8f8RvQj5^+DUr+P)IQdRouH%K{-!fN3;r^D6B%v0pPxNs~c;Bm@Uss;Y<_ z4|v6wNYDbyu{6&Ec-AemH0SgAx;c;RVf}mwVl--ZpA$Nw%cEAkz|iH^qUbUVU%xCM z2of)I94)#19L;h51T6v1LnnAY=jQoj!k^%(iEP2!G{dULWn@xP#Z8^NoC`xxj&F0H zKSw?VG+cR=LzQODAH>j;W?ssH-eI^y7FPS^xU(J61OdkSKS-<3#+To zxe)dq_5WOm`c9Tpk~R#K5L4a6)q#brU3o=kS68)S=T>9D`il}_CBt1Ml`05!kU3-Z z%;ouUt0L2*rTK!7g&&5qek-na8Fd}PyV_;cweGoHQ_YaOk_{QQd0GFX2{icjW*)w#x&Gj!qdvWcRaj`T-*2Mg~UeXw_=y?4#sJ+FlCNQGA&FU%ZW zo9kTjE z+mAoHPy6j%k9NF$w3%6P>d&XHT%5er>i8_SXPwp*4Nt9Iw0H3}i%*_7mpxDQG%b1X zuZvbq`~VEyv-FpluIWoH>%Xz`@QPPIH1Bq9aQ^63=Y|)~1ot=ZZGG>`)g#MJe=xIr z_jN7jDXrsy-pHYA7oXg@yXpDqmUwgO*p78u^7p;}(z#2;V?RCZePSd zo6qff>hvzE{odby?X|Nh{=&v*e*KafdpB|9{QjkXQer<``p{<3didL}Teidx4qpE9 z$$wt;6%V~pd~7lqUcKYzZ%$>-j7`Rly|M1jk6xJkq~n@J!#@V<>f8VEhxd=HK7PlZ zhqG_p^Q*D8;E?sCy*!L~yK diff --git a/webui/public/img/check.svg b/webui/public/img/check.svg new file mode 100644 index 0000000000..25cb3194df --- /dev/null +++ b/webui/public/img/check.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/webui/public/img/indeterminate.svg b/webui/public/img/indeterminate.svg new file mode 100644 index 0000000000..eb4bcdf675 --- /dev/null +++ b/webui/public/img/indeterminate.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/webui/src/scss/_controls.scss b/webui/src/scss/_controls.scss index 2ee3830cdf..ae5ceacf23 100644 --- a/webui/src/scss/_controls.scss +++ b/webui/src/scss/_controls.scss @@ -9,11 +9,20 @@ } input[type='checkbox']:checked { - background: 0 0 url('/img/check.png') no-repeat; + background: 0 0 url('/img/check.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: contain; } input[type='checkbox']:disabled { background: #eee; } + input[type='checkbox']:indeterminate { + background: 0 0 url('/img/indeterminate.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + } } label.disabled {