@things-factory/invoice 10.1.256 → 10.1.258
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/document/document-defaults.d.ts +11 -2
- package/dist-client/document/document-defaults.js +7 -15
- package/dist-client/document/document-defaults.js.map +1 -1
- package/dist-client/document/document-party.d.ts +5 -2
- package/dist-client/document/document-party.js +21 -21
- package/dist-client/document/document-party.js.map +1 -1
- package/dist-client/entity360/invoice-360.d.ts +3 -4
- package/dist-client/entity360/invoice-360.js +17 -38
- package/dist-client/entity360/invoice-360.js.map +1 -1
- package/dist-client/index.d.ts +1 -1
- package/dist-client/index.js +1 -1
- package/dist-client/index.js.map +1 -1
- package/dist-client/invoice-files.d.ts +4 -10
- package/dist-client/invoice-files.js +19 -58
- package/dist-client/invoice-files.js.map +1 -1
- package/dist-client/pages/invoice-editor.d.ts +42 -19
- package/dist-client/pages/invoice-editor.js +150 -179
- package/dist-client/pages/invoice-editor.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/document-defaults-setting-let.d.ts +7 -2
- package/dist-client/viewparts/document-defaults-setting-let.js +30 -35
- package/dist-client/viewparts/document-defaults-setting-let.js.map +1 -1
- package/package.json +13 -13
|
@@ -4,8 +4,13 @@ import { LitElement, nothing } from 'lit';
|
|
|
4
4
|
declare const DocumentDefaultsSettingLet_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
5
5
|
export declare class DocumentDefaultsSettingLet extends DocumentDefaultsSettingLet_base {
|
|
6
6
|
static styles: import("lit").CSSResult[];
|
|
7
|
-
|
|
8
|
-
private
|
|
7
|
+
/** Whether this person keeps the invoices and may read the company's words - unknown, and nothing read, until asked. */
|
|
8
|
+
private may;
|
|
9
|
+
private defaults;
|
|
10
|
+
private saving;
|
|
11
|
+
/** What is typed over the words read; a save clears what it sent. */
|
|
12
|
+
private draft;
|
|
13
|
+
private get value();
|
|
9
14
|
connectedCallback(): Promise<void>;
|
|
10
15
|
render(): typeof nothing | import("lit-html").TemplateResult<1>;
|
|
11
16
|
private save;
|
|
@@ -4,11 +4,12 @@ import '@things-factory/setting-base';
|
|
|
4
4
|
import gql from 'graphql-tag';
|
|
5
5
|
import { css, html, LitElement, nothing } from 'lit';
|
|
6
6
|
import { customElement, state } from 'lit/decorators.js';
|
|
7
|
-
import {
|
|
7
|
+
import { MutationController, QueryController } from '@operato/graphql';
|
|
8
|
+
import { DraftController } from '@operato/shell';
|
|
8
9
|
import { i18next, localize } from '@operato/i18n';
|
|
9
10
|
import { notify } from '@operato/layout';
|
|
10
11
|
import { hasPrivilege } from '@things-factory/auth-base/dist-client';
|
|
11
|
-
import { DOCUMENT_DEFAULTS_FIELDS,
|
|
12
|
+
import { DOCUMENT_DEFAULTS, DOCUMENT_DEFAULTS_FIELDS, DOCUMENT_DEFAULTS_READER } from '../document/document-defaults';
|
|
12
13
|
/**
|
|
13
14
|
* The company's own words for every new quotation and invoice (ADR-0170): the account to pay into, the
|
|
14
15
|
* payment terms offered - one a line, the first a new document's - a standing note, how long an offer holds and how
|
|
@@ -20,7 +21,13 @@ const inputOf = ({ supplierName, supplierRegistrationNumber, supplierAddress, ..
|
|
|
20
21
|
let DocumentDefaultsSettingLet = class DocumentDefaultsSettingLet extends localize(i18next)(LitElement) {
|
|
21
22
|
constructor() {
|
|
22
23
|
super(...arguments);
|
|
23
|
-
this.
|
|
24
|
+
/** Whether this person keeps the invoices and may read the company's words - unknown, and nothing read, until asked. */
|
|
25
|
+
this.may = false;
|
|
26
|
+
/* The company's words, read for whoever may change them (ADR-0190). */
|
|
27
|
+
this.defaults = new QueryController(this, DOCUMENT_DEFAULTS, { variables: () => (this.may ? {} : undefined) });
|
|
28
|
+
this.saving = new MutationController(this, gql(`mutation ($defaults: DocumentDefaultsInput!) { updateDocumentDefaults(defaults: $defaults) { ${DOCUMENT_DEFAULTS_FIELDS} } }`), { refetch: () => [this.defaults] });
|
|
29
|
+
/** What is typed over the words read; a save clears what it sent. */
|
|
30
|
+
this.draft = new DraftController(this, { read: () => this.defaults.data?.documentDefaults ?? undefined });
|
|
24
31
|
}
|
|
25
32
|
static { this.styles = [
|
|
26
33
|
css `
|
|
@@ -67,19 +74,24 @@ let DocumentDefaultsSettingLet = class DocumentDefaultsSettingLet extends locali
|
|
|
67
74
|
}
|
|
68
75
|
`
|
|
69
76
|
]; }
|
|
77
|
+
get value() {
|
|
78
|
+
const read = this.defaults.data?.documentDefaults;
|
|
79
|
+
return read ? { ...read, ...this.draft.edits } : undefined;
|
|
80
|
+
}
|
|
70
81
|
async connectedCallback() {
|
|
71
82
|
super.connectedCallback();
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
/* Asked only of whoever may read them - a refusal would be shown to someone who never asked for it. */
|
|
84
|
+
this.may =
|
|
85
|
+
!!(await hasPrivilege({ category: 'invoice', privilege: 'mutation', domainOwnerGranted: true })) &&
|
|
86
|
+
!!(await hasPrivilege(DOCUMENT_DEFAULTS_READER));
|
|
75
87
|
}
|
|
76
88
|
render() {
|
|
77
89
|
const value = this.value;
|
|
78
90
|
if (!value)
|
|
79
91
|
return nothing;
|
|
80
|
-
const set = (
|
|
81
|
-
const input = (name, label) => html `<label>${i18next.t(label)}<input .value=${String(value[name] ?? '')} @input=${(e) => set(
|
|
82
|
-
const prose = (name, label) => html `<label class="wide">${i18next.t(label)}<textarea .value=${String(value[name] ?? '')} @input=${(e) => set(
|
|
92
|
+
const set = (name, given) => this.draft.set(name, given);
|
|
93
|
+
const input = (name, label) => html `<label>${i18next.t(label)}<input .value=${String(value[name] ?? '')} @input=${(e) => set(name, e.target.value)} /></label>`;
|
|
94
|
+
const prose = (name, label) => html `<label class="wide">${i18next.t(label)}<textarea .value=${String(value[name] ?? '')} @input=${(e) => set(name, e.target.value)}></textarea></label>`;
|
|
83
95
|
return html `
|
|
84
96
|
<setting-let>
|
|
85
97
|
<span slot="title">${i18next.t('title.invoice-document-defaults')}</span>
|
|
@@ -87,52 +99,35 @@ let DocumentDefaultsSettingLet = class DocumentDefaultsSettingLet extends locali
|
|
|
87
99
|
${prose('bankDetails', 'field.invoice-bank-details')}
|
|
88
100
|
<label class="wide"
|
|
89
101
|
>${i18next.t('field.invoice-payment-terms')} <small>${i18next.t('text.invoice-defaults-terms-hint')}</small>
|
|
90
|
-
<textarea .value=${value.paymentTerms.join('\n')} @input=${(e) => set(
|
|
102
|
+
<textarea .value=${value.paymentTerms.join('\n')} @input=${(e) => set('paymentTerms', e.target.value.split('\n'))}></textarea>
|
|
91
103
|
</label>
|
|
92
104
|
${prose('notes', 'field.invoice-notes')}
|
|
93
105
|
<label
|
|
94
106
|
>${i18next.t('field.invoice-defaults-valid-days')}
|
|
95
|
-
<input type="number" min="1" max="365" .value=${String(value.validDays ?? '')} @input=${(e) => set(
|
|
107
|
+
<input type="number" min="1" max="365" .value=${String(value.validDays ?? '')} @input=${(e) => set('validDays', e.target.value === '' ? null : Number(e.target.value))}
|
|
96
108
|
/></label>
|
|
97
109
|
<label
|
|
98
110
|
>${i18next.t('field.invoice-defaults-payment-days')}
|
|
99
|
-
<input type="number" min="0" max="365" .value=${String(value.paymentDays ?? '')} @input=${(e) => set(
|
|
111
|
+
<input type="number" min="0" max="365" .value=${String(value.paymentDays ?? '')} @input=${(e) => set('paymentDays', e.target.value === '' ? null : Number(e.target.value))}
|
|
100
112
|
/></label>
|
|
101
113
|
<div actions>
|
|
102
|
-
<md-outlined-button ?disabled=${this.
|
|
114
|
+
<md-outlined-button ?disabled=${this.saving.pending} @click=${() => this.save()}>${i18next.t('button.save')}</md-outlined-button>
|
|
103
115
|
</div>
|
|
104
116
|
</div>
|
|
105
117
|
</setting-let>
|
|
106
118
|
`;
|
|
107
119
|
}
|
|
108
120
|
async save() {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
variables: { defaults: inputOf(this.value) }
|
|
114
|
-
});
|
|
115
|
-
if (response.errors?.length)
|
|
116
|
-
throw response.errors[0];
|
|
117
|
-
this.value = response.data.updateDocumentDefaults;
|
|
118
|
-
notify({ message: i18next.t('text.saved') });
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
notify({ level: 'error', message: error?.message ?? String(error) });
|
|
122
|
-
}
|
|
123
|
-
finally {
|
|
124
|
-
this.busy = false;
|
|
125
|
-
}
|
|
121
|
+
const defaults = inputOf(this.value);
|
|
122
|
+
if (!(await this.draft.submit(() => this.saving.run({ defaults }))))
|
|
123
|
+
return;
|
|
124
|
+
notify({ message: i18next.t('text.saved') });
|
|
126
125
|
}
|
|
127
126
|
};
|
|
128
127
|
__decorate([
|
|
129
128
|
state(),
|
|
130
129
|
__metadata("design:type", Object)
|
|
131
|
-
], DocumentDefaultsSettingLet.prototype, "
|
|
132
|
-
__decorate([
|
|
133
|
-
state(),
|
|
134
|
-
__metadata("design:type", Object)
|
|
135
|
-
], DocumentDefaultsSettingLet.prototype, "busy", void 0);
|
|
130
|
+
], DocumentDefaultsSettingLet.prototype, "may", void 0);
|
|
136
131
|
DocumentDefaultsSettingLet = __decorate([
|
|
137
132
|
customElement('document-defaults-setting-let')
|
|
138
133
|
], DocumentDefaultsSettingLet);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-defaults-setting-let.js","sourceRoot":"","sources":["../../client/viewparts/document-defaults-setting-let.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/outlined-button.js'\nimport '@things-factory/setting-base'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { DOCUMENT_DEFAULTS_FIELDS, documentDefaults, type DocumentDefaults } from '../document/document-defaults'\n\n/**\n * The company's own words for every new quotation and invoice (ADR-0170): the account to pay into, the\n * payment terms offered - one a line, the first a new document's - a standing note, how long an offer holds and how\n * many days after its issue an invoice is due. Shown\n * to whoever keeps the invoices; for anyone else the card stays empty.\n */\n/* Our name, number and address come with the defaults but are 「우리 회사」's, kept on its own card (ADR-0176). */\nconst inputOf = ({ supplierName, supplierRegistrationNumber, supplierAddress, ...defaults }: DocumentDefaults) => defaults\n\n@customElement('document-defaults-setting-let')\nexport class DocumentDefaultsSettingLet extends localize(i18next)(LitElement) {\n static styles = [\n css`\n div[content] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));\n gap: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n }\n label {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n font: var(--label-font);\n color: var(--md-sys-color-on-surface);\n text-transform: var(--label-text-transform);\n }\n label.wide {\n grid-column: 1 / -1;\n }\n small {\n color: var(--md-sys-color-on-surface-variant);\n text-transform: none;\n }\n input,\n textarea {\n box-sizing: border-box;\n width: 100%;\n background-color: var(--input-field-background, var(--md-sys-color-surface-container-highest));\n color: var(--input-field-color, var(--md-sys-color-on-surface));\n border: var(--border-dim-color);\n border-radius: var(--border-radius);\n padding: var(--input-padding);\n font: var(--input-font);\n text-transform: none;\n }\n textarea {\n min-height: 64px;\n resize: vertical;\n }\n div[actions] {\n grid-column: 1 / -1;\n display: flex;\n justify-content: flex-end;\n }\n `\n ]\n\n @state() private value?: DocumentDefaults\n @state() private busy = false\n\n async connectedCallback() {\n super.connectedCallback()\n if (!(await hasPrivilege({ category: 'invoice', privilege: 'mutation', domainOwnerGranted: true }))) return\n this.value = (await documentDefaults()) ?? undefined\n }\n\n render() {\n const value = this.value\n if (!value) return nothing\n const set = (patch: Partial<DocumentDefaults>) => (this.value = { ...value, ...patch })\n const input = (name: keyof DocumentDefaults, label: string) =>\n html`<label>${i18next.t(label)}<input .value=${String(value[name] ?? '')} @input=${(e: any) => set({ [name]: e.target.value })} /></label>`\n const prose = (name: keyof DocumentDefaults, label: string) =>\n html`<label class=\"wide\">${i18next.t(label)}<textarea .value=${String(value[name] ?? '')} @input=${(e: any) => set({ [name]: e.target.value })}></textarea></label>`\n\n return html`\n <setting-let>\n <span slot=\"title\">${i18next.t('title.invoice-document-defaults')}</span>\n <div slot=\"content\" content>\n ${prose('bankDetails', 'field.invoice-bank-details')}\n <label class=\"wide\"\n >${i18next.t('field.invoice-payment-terms')} <small>${i18next.t('text.invoice-defaults-terms-hint')}</small>\n <textarea .value=${value.paymentTerms.join('\\n')} @input=${(e: any) => set({ paymentTerms: e.target.value.split('\\n') })}></textarea>\n </label>\n ${prose('notes', 'field.invoice-notes')}\n <label\n >${i18next.t('field.invoice-defaults-valid-days')}\n <input type=\"number\" min=\"1\" max=\"365\" .value=${String(value.validDays ?? '')} @input=${(e: any) => set({ validDays: e.target.value === '' ? null : Number(e.target.value) })}\n /></label>\n <label\n >${i18next.t('field.invoice-defaults-payment-days')}\n <input type=\"number\" min=\"0\" max=\"365\" .value=${String(value.paymentDays ?? '')} @input=${(e: any) => set({ paymentDays: e.target.value === '' ? null : Number(e.target.value) })}\n /></label>\n <div actions>\n <md-outlined-button ?disabled=${this.busy} @click=${() => this.save()}>${i18next.t('button.save')}</md-outlined-button>\n </div>\n </div>\n </setting-let>\n `\n }\n\n private async save() {\n this.busy = true\n try {\n const response = await client.mutate({\n mutation: gql(`mutation ($defaults: DocumentDefaultsInput!) { updateDocumentDefaults(defaults: $defaults) { ${DOCUMENT_DEFAULTS_FIELDS} } }`),\n variables: { defaults: inputOf(this.value!) }\n })\n if (response.errors?.length) throw response.errors[0]\n this.value = response.data.updateDocumentDefaults\n notify({ message: i18next.t('text.saved') })\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n } finally {\n this.busy = false\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"document-defaults-setting-let.js","sourceRoot":"","sources":["../../client/viewparts/document-defaults-setting-let.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/outlined-button.js'\nimport '@things-factory/setting-base'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController } from '@operato/graphql'\nimport { DraftController } from '@operato/shell'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { DOCUMENT_DEFAULTS, DOCUMENT_DEFAULTS_FIELDS, DOCUMENT_DEFAULTS_READER, type DocumentDefaults } from '../document/document-defaults'\n\n/**\n * The company's own words for every new quotation and invoice (ADR-0170): the account to pay into, the\n * payment terms offered - one a line, the first a new document's - a standing note, how long an offer holds and how\n * many days after its issue an invoice is due. Shown\n * to whoever keeps the invoices; for anyone else the card stays empty.\n */\n/* Our name, number and address come with the defaults but are 「우리 회사」's, kept on its own card (ADR-0176). */\nconst inputOf = ({ supplierName, supplierRegistrationNumber, supplierAddress, ...defaults }: DocumentDefaults) => defaults\n\n@customElement('document-defaults-setting-let')\nexport class DocumentDefaultsSettingLet extends localize(i18next)(LitElement) {\n static styles = [\n css`\n div[content] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));\n gap: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n }\n label {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n font: var(--label-font);\n color: var(--md-sys-color-on-surface);\n text-transform: var(--label-text-transform);\n }\n label.wide {\n grid-column: 1 / -1;\n }\n small {\n color: var(--md-sys-color-on-surface-variant);\n text-transform: none;\n }\n input,\n textarea {\n box-sizing: border-box;\n width: 100%;\n background-color: var(--input-field-background, var(--md-sys-color-surface-container-highest));\n color: var(--input-field-color, var(--md-sys-color-on-surface));\n border: var(--border-dim-color);\n border-radius: var(--border-radius);\n padding: var(--input-padding);\n font: var(--input-font);\n text-transform: none;\n }\n textarea {\n min-height: 64px;\n resize: vertical;\n }\n div[actions] {\n grid-column: 1 / -1;\n display: flex;\n justify-content: flex-end;\n }\n `\n ]\n\n /** Whether this person keeps the invoices and may read the company's words - unknown, and nothing read, until asked. */\n @state() private may = false\n\n /* The company's words, read for whoever may change them (ADR-0190). */\n private defaults = new QueryController(this, DOCUMENT_DEFAULTS, { variables: () => (this.may ? {} : undefined) })\n\n private saving = new MutationController(\n this,\n gql(`mutation ($defaults: DocumentDefaultsInput!) { updateDocumentDefaults(defaults: $defaults) { ${DOCUMENT_DEFAULTS_FIELDS} } }`),\n { refetch: () => [this.defaults] }\n )\n\n /** What is typed over the words read; a save clears what it sent. */\n private draft = new DraftController<DocumentDefaults>(this, { read: () => this.defaults.data?.documentDefaults ?? undefined })\n\n private get value(): DocumentDefaults | undefined {\n const read = this.defaults.data?.documentDefaults\n return read ? { ...read, ...this.draft.edits } : undefined\n }\n\n async connectedCallback() {\n super.connectedCallback()\n /* Asked only of whoever may read them - a refusal would be shown to someone who never asked for it. */\n this.may =\n !!(await hasPrivilege({ category: 'invoice', privilege: 'mutation', domainOwnerGranted: true })) &&\n !!(await hasPrivilege(DOCUMENT_DEFAULTS_READER))\n }\n\n render() {\n const value = this.value\n if (!value) return nothing\n const set = <K extends keyof DocumentDefaults>(name: K, given: DocumentDefaults[K]) => this.draft.set(name, given)\n const input = (name: keyof DocumentDefaults, label: string) =>\n html`<label>${i18next.t(label)}<input .value=${String(value[name] ?? '')} @input=${(e: any) => set(name, e.target.value)} /></label>`\n const prose = (name: keyof DocumentDefaults, label: string) =>\n html`<label class=\"wide\">${i18next.t(label)}<textarea .value=${String(value[name] ?? '')} @input=${(e: any) => set(name, e.target.value)}></textarea></label>`\n\n return html`\n <setting-let>\n <span slot=\"title\">${i18next.t('title.invoice-document-defaults')}</span>\n <div slot=\"content\" content>\n ${prose('bankDetails', 'field.invoice-bank-details')}\n <label class=\"wide\"\n >${i18next.t('field.invoice-payment-terms')} <small>${i18next.t('text.invoice-defaults-terms-hint')}</small>\n <textarea .value=${value.paymentTerms.join('\\n')} @input=${(e: any) => set('paymentTerms', e.target.value.split('\\n'))}></textarea>\n </label>\n ${prose('notes', 'field.invoice-notes')}\n <label\n >${i18next.t('field.invoice-defaults-valid-days')}\n <input type=\"number\" min=\"1\" max=\"365\" .value=${String(value.validDays ?? '')} @input=${(e: any) => set('validDays', e.target.value === '' ? null : Number(e.target.value))}\n /></label>\n <label\n >${i18next.t('field.invoice-defaults-payment-days')}\n <input type=\"number\" min=\"0\" max=\"365\" .value=${String(value.paymentDays ?? '')} @input=${(e: any) => set('paymentDays', e.target.value === '' ? null : Number(e.target.value))}\n /></label>\n <div actions>\n <md-outlined-button ?disabled=${this.saving.pending} @click=${() => this.save()}>${i18next.t('button.save')}</md-outlined-button>\n </div>\n </div>\n </setting-let>\n `\n }\n\n private async save() {\n const defaults = inputOf(this.value!)\n if (!(await this.draft.submit(() => this.saving.run({ defaults })))) return\n notify({ message: i18next.t('text.saved') })\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/invoice",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.258",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -22,23 +22,23 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@material/web": "^2.0.0",
|
|
24
24
|
"@operato/attachment": "^10.29.45",
|
|
25
|
-
"@operato/data-grist": "^10.
|
|
26
|
-
"@operato/graphql": "^10.
|
|
25
|
+
"@operato/data-grist": "^10.29.69",
|
|
26
|
+
"@operato/graphql": "^10.29.69",
|
|
27
27
|
"@operato/i18n": "^10.0.0",
|
|
28
28
|
"@operato/input": "^10.29.44",
|
|
29
|
-
"@operato/layout": "^10.
|
|
29
|
+
"@operato/layout": "^10.29.69",
|
|
30
30
|
"@operato/list-state": "^10.29.1",
|
|
31
31
|
"@operato/popup": "^10.0.0",
|
|
32
|
-
"@operato/shell": "^10.
|
|
32
|
+
"@operato/shell": "^10.29.69",
|
|
33
33
|
"@operato/styles": "^10.29.1",
|
|
34
34
|
"@operato/utils": "^10.0.0",
|
|
35
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
36
|
-
"@things-factory/attachment-base": "^10.1.
|
|
37
|
-
"@things-factory/auth-base": "^10.1.
|
|
38
|
-
"@things-factory/biz-base": "^10.1.
|
|
39
|
-
"@things-factory/pdf": "^10.1.
|
|
40
|
-
"@things-factory/setting-base": "^10.1.
|
|
41
|
-
"@things-factory/shell": "^10.1.
|
|
35
|
+
"@things-factory/ai-assistant": "^10.1.258",
|
|
36
|
+
"@things-factory/attachment-base": "^10.1.258",
|
|
37
|
+
"@things-factory/auth-base": "^10.1.258",
|
|
38
|
+
"@things-factory/biz-base": "^10.1.258",
|
|
39
|
+
"@things-factory/pdf": "^10.1.258",
|
|
40
|
+
"@things-factory/setting-base": "^10.1.258",
|
|
41
|
+
"@things-factory/shell": "^10.1.258",
|
|
42
42
|
"graphql-upload": "^15.0.2"
|
|
43
43
|
},
|
|
44
44
|
"publishConfig": {
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"url": "git+https://github.com/hatiolab/things-factory.git",
|
|
52
52
|
"directory": "packages/invoice"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "c7b7e3b4e9aa1b36a246ccee312a4124a50924dd"
|
|
55
55
|
}
|