infinity-forge 8.5.1 → 8.5.2

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.
@@ -4,186 +4,7 @@ exports.NaoRemoverDaHomeUsadaParaTesteTestarAquiDentro = NaoRemoverDaHomeUsadaPa
4
4
  var jsx_runtime_1 = require("react/jsx-runtime");
5
5
  var ui_1 = require("../ui/index.js");
6
6
  function NaoRemoverDaHomeUsadaParaTesteTestarAquiDentro() {
7
- return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(ui_1.ZoomOnHover, { zoom: 2, children: (0, jsx_runtime_1.jsx)("img", { src: "https://nick-content.s3.amazonaws.com/production/system/d04296cf-3817-48db-915d-10828eec3486/2024/10/12/a6901c7d-9458-4543-b443-f229246d0c74.jpeg", alt: "Produto", style: { width: '100%', height: '100%', objectFit: 'cover' } }) }) }));
8
- }
9
- //1. Autocomplete
10
- //2. button
11
- //2.1.Que a estilização herda do buttonStyles que injetado na InfinityForgeProvider
12
- //2.2 <Button /> herda os estados do formulário, como assim? Se o formulário estiver carregando já trata por trás do panos de fazer o efeito visual
13
- //3.@DEFAULT = TRUE cleanFieldsOnSubmit={false} - É pra limpar os campos após o submit? Tem casos que você quer manter os dados no formulário
14
- //4.CustomAction
15
- {
16
- /* <FormHandler
17
- autoComplete='off'
18
- button={{}}
19
- cleanFieldsOnSubmit
20
- customAction={{
21
- Component: ({ values, setFieldValue, stateForm }) => {
22
-
23
- if(stateForm.state === "loading") {
24
- return <LoaderCircle />
25
- }
26
-
27
- if (values.name === 'Tiago') {
28
- return <button onClick={() => {
29
- setModal(true);
30
- setFieldValue("genero", "masculino")
31
- }}>Ação X</button>
32
- }
33
-
34
- return <button>Ação Y</button>
35
- },
36
- }}
37
- >
38
- <Select name="genero" options={[{ label: "Masculino", value: "masculino" }]} />
39
- </FormHandler> */
40
- }
41
- //5.Custom Submit
42
- {
43
- //Paciente
44
- /* <FormHandler
45
- button={{ text: 'Salvar dados do paciente' }}
46
- initialData={{ genero: 'masculino' }}
47
- cleanFieldsOnSubmit={false}
48
- customSubmit={[
49
- {
50
- active: false, //habilita e desabilita o botão de submit customizado
51
- action: async (data, setStateForm, initialValues, handlers) => {
52
- if (data.genero === 'feminino' && initialValues.genero === 'masculino') {
53
- throw new ValidationError({
54
- validationErrors: { genero: { errors: ['Você não pode mudar o seu genero'] } },
55
- })
56
- } else {
57
- setStateForm({ state: 'loading', message: '' })
58
-
59
- await api({ url: '/mudargenero', method: 'post', body: data })
60
- }
61
- },
62
- props: ({ state, message }, setFieldValue) => ({
63
- text: state === 'loading' ? 'Carregando...' : 'Salvar dados e imprimir generos disponiveis',
64
- loading: false,
65
- onClick: () => setFieldValue(''),
66
- disabled: message === 'desabilitar' ? true : false,
67
- }),
68
- },
69
- ]}
70
-
71
- >
72
- <Select
73
- name='genero'
74
- onlyOneValue
75
- options={[
76
- { label: 'Masculino', value: 'masculino' },
77
- { label: 'feminino', value: 'feminino' },
78
- { label: 'Outros', value: 'outros' },
79
- ]}
80
- />
81
- </FormHandler> */
82
- }
83
- //6. Decimal fields > baseado no name do campo ele vai tentar transformar a string para valor númerico
84
- //7. Link pros validators que existem //Defaults schemaas destrinchar e talvez fazer subtópicos para eles
85
- //8.Default schemas
86
- // 8.1 No nosso defaultSchema possuimos uma série de validações padrões prontas para uso por exemplo:
87
- // O campo phone utilizase da validação de um utilário chamado: <linK>ValidatePhone</linK> neste link você poder ver mais detalhes sobre a validação feita
88
- //9.1 - disableEnterKeySubmitForm - vc avaliar como fica a melhor descrição, evitar que no enter dê submit por padrão é true
89
- //10.
90
- {
91
- /* <FormHandler
92
- onSucess={async (data) => {
93
- console.log(data)
94
- }}
95
- button={{ text: 'Salvar dados do paciente' }}
96
- i18n={{
97
- schema: { name: yup.string().required('Campo requerido') },
98
- RenderFields: ({ symbol }) => {
99
- return (
100
- <>
101
- <Input name={`${symbol}.name`} />
102
- </>
103
- )
104
- },
105
- }}
106
- ></FormHandler> */
107
- }
108
- //11.InitialData que a chave tentara buscar um campo no formulário que de "match" para o campo começar com aquele valor
109
- //12.isStickyButtons se o formulário possuir uma altura "fixa" a parte inferior das "ações" ficaram com position sticky ou seja acompanhando o formulário durante o seu preenchimento
110
- //13.messageProvider={{ }}
111
- //14. modifyInitialData={() => {}} ele irá modificar os dados iniciais que serão jogados pra dentro dos campos, o useTable, Atena muitas funcionalidade dentro do infinity-forge não possuem controle pleno do initialData por isso via função as vezes é necessário este controle
112
- //15
113
- {
114
- /* <FormHandler
115
- onSucess={async (data) => {
116
- console.log(data)
117
- }}
118
- modifySchema={({ schema, data }) => {
119
- let newSchema = schema
120
-
121
- if (data.paymentMethod === 'PIX') {
122
- newSchema = {
123
- ...newSchema,
124
- cpf: yup.string().required('Campo requerido'),
125
- }
126
- }
127
-
128
- if (data.paymentMethod === 'CREDIT_CARD') {
129
- newSchema = {
130
- ...newSchema,
131
- creditCardName: yup.string().required('Campo requerido'),
132
- creditCardNumber: yup.string().required('Campo requerido'),
133
- creditCardVV: yup.string().required('Campo requerido'),
134
- }
135
- }
136
-
137
- return newSchema
138
- }}
139
- >
140
- <Input name='name' />
141
- </FormHandler> */
142
- }
143
- //16.onChangeForm
144
- // const [name, setName] = useState('')
145
- // return (
146
- // <>
147
- // <button
148
- // type='button'
149
- // onClick={() => {
150
- // setName('Roberto')
151
- // }}
152
- // >Roberto</button>
153
- // <FormHandler
154
- // onSucess={async (data) => {
155
- // console.log(data)
156
- // }}
157
- // initialData={{ name }}
158
- // decimalFields={["idade"]}
159
- // onChangeForm={{
160
- // callbackResult: (dataForm) => {
161
- // setName(dataForm.name)
162
- // if (name === 'Roberto' && dataForm.idade > 22) {
163
- // window.alert('Não permitimos robertos no sistema.')
164
- // }
165
- // },
166
- // additionalDependencies: [name], //Se remover a dependencia caso sete roberto no useState não poderá ser mais válidado pois não terá a dependencia
167
- // }}
168
- // >
169
- // <Input name='name' />
170
- // <Input name='idade' />
171
- // </FormHandler>
172
- // </>
173
- // )
174
- //17. O onFinish executa após a ação do onSucess e o legal é que ele possui o data que está vindo e os dados iniciais que foram recebidos no initialData
175
- {
176
- /* <FormHandler
177
- onSucess={async (data) => {
178
- //Criar usuário
179
- }}
180
- onFinish={(data) => {
181
- // Logue o usuário
182
- }}
183
- >
184
- <Input name='name' />
185
-
186
- <Input name='idade' />
187
- </FormHandler> */
7
+ var _a = (0, ui_1.useTextEditor)(), handleEditorReady = _a.handleEditorReady, handleInsert = _a.handleInsert;
8
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ui_1.FormHandler, { disableEnterKeySubmitForm: true, onChangeForm: { callbackResult: function (v) { return console.log(v); } }, children: (0, jsx_runtime_1.jsx)(ui_1.TextEditor, { name: "prontuario", onEditorReady: handleEditorReady }) }), (0, jsx_runtime_1.jsx)("div", { onClick: function () { return handleInsert("Medicamento 1"); }, children: "Medicamento 1" }), (0, jsx_runtime_1.jsx)("div", { onClick: function () { return handleInsert("Medicamento 2"); }, children: "Medicamento 2" })] }));
188
9
  }
189
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.tsx"],"names":[],"mappings":";;AAMA,wGAkBC;;AAxBD,2BAA0F;AAM1F,SAAgB,8CAA8C;IAG5D,OAAO,CACL,2DAII,uBAAC,gBAAW,IAAC,IAAI,EAAE,CAAC,YAClB,gCACE,GAAG,EAAC,mJAAmJ,EACvJ,GAAG,EAAC,SAAS,EACb,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAC5D,GACU,GAEf,CACJ,CAAA;AACH,CAAC;AAGD,iBAAiB;AACjB,WAAW;AACX,mFAAmF;AACnF,mJAAmJ;AACnJ,6IAA6I;AAC7I,gBAAgB;AAChB,CAAC;IACC;;;;;;;;;;;;;;;;;;;;;;;mBAuBe;AACjB,CAAC;AACD,iBAAiB;AACjB,CAAC;IACC,UAAU;IACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAqCqB;AACvB,CAAC;AAED,sGAAsG;AAEtG,yGAAyG;AACzG,mBAAmB;AACnB,qGAAqG;AACrG,4JAA4J;AAC5J,4HAA4H;AAE5H,KAAK;AACL,CAAC;IACC;;;;;;;;;;;;;;;oBAegB;AAClB,CAAC;AAED,uHAAuH;AAEvH,qLAAqL;AACrL,2BAA2B;AAC3B,kRAAkR;AAClR,IAAI;AACJ,CAAC;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA2BqB;AACvB,CAAC;AAED,iBAAiB;AACjB,uCAAuC;AAEvC,WAAW;AACX,OAAO;AACP,cAAc;AACd,sBAAsB;AACtB,yBAAyB;AACzB,6BAA6B;AAC7B,WAAW;AACX,wBAAwB;AAExB,mBAAmB;AACnB,oCAAoC;AACpC,4BAA4B;AAC5B,WAAW;AACX,+BAA+B;AAC/B,kCAAkC;AAClC,wBAAwB;AACxB,0CAA0C;AAC1C,mCAAmC;AAEnC,6DAA6D;AAC7D,kEAAkE;AAClE,cAAc;AACd,aAAa;AACb,4JAA4J;AAC5J,WAAW;AACX,QAAQ;AACR,8BAA8B;AAE9B,+BAA+B;AAC/B,qBAAqB;AACrB,QAAQ;AACR,IAAI;AAEJ,wJAAwJ;AACxJ,CAAC;IACC;;;;;;;;;;;yBAWqB;AACvB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.tsx"],"names":[],"mappings":";;AAKA,wGA0BC;;AA7BD,2BAA8D;AAG9D,SAAgB,8CAA8C;IAEtD,IAAA,KAAsC,IAAA,kBAAa,GAAE,EAAnD,iBAAiB,uBAAA,EAAE,YAAY,kBAAoB,CAAA;IAE3D,OAAO,CACL,6DACE,uBAAC,gBAAW,IAAC,yBAAyB,QAAC,YAAY,EAAE,EAAE,cAAc,EAAE,UAAA,CAAC,IAAI,OAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAd,CAAc,EAAE,YAC1F,uBAAC,eAAU,IACT,IAAI,EAAC,YAAY,EACjB,aAAa,EAAE,iBAAiB,GAChC,GACU,EAEd,gCACE,OAAO,EAAE,cAAM,OAAA,YAAY,CAAC,eAAe,CAAC,EAA7B,CAA6B,8BAGxC,EAEN,gCACE,OAAO,EAAE,cAAM,OAAA,YAAY,CAAC,eAAe,CAAC,EAA7B,CAA6B,8BAGxC,IACL,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { InputProps } from '../interfaces.js';
2
+ import { EditorQuillHandle } from './quill.js';
3
+ export type TextEditorProps = {
4
+ disableToolbar?: boolean;
5
+ onEditorReady?: (insert: EditorQuillHandle['insertText']) => void;
6
+ } & Partial<InputProps>;
7
+ export declare const TextEditor: import("react").ForwardRefExoticComponent<{
8
+ disableToolbar?: boolean;
9
+ onEditorReady?: (insert: EditorQuillHandle["insertText"]) => void;
10
+ } & Partial<InputProps> & import("react").RefAttributes<EditorQuillHandle>>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.TextEditor = void 0;
51
+ var jsx_runtime_1 = require("react/jsx-runtime");
52
+ var react_1 = require("react");
53
+ var formik_1 = require("formik");
54
+ var dynamic_1 = __importDefault(require("next/dynamic"));
55
+ var input_control_1 = require("../input-control/index.js");
56
+ var EditorQuill = (0, dynamic_1.default)(function () { return Promise.resolve().then(function () { return __importStar(require("./quill.js")); }).then(function (r) { return r.QuillEditor; }); }, {
57
+ loading: function () { return (0, jsx_runtime_1.jsx)("div", { children: "loading..." }); },
58
+ ssr: false,
59
+ });
60
+ exports.TextEditor = (0, react_1.forwardRef)(function (props, ref) {
61
+ var _a = (0, formik_1.useField)({ name: props.name }), field = _a[0], helpers = _a[2];
62
+ var handleOnChange = function (val) { return helpers.setValue(val); };
63
+ return ((0, jsx_runtime_1.jsx)(input_control_1.InputControl, __assign({}, props, { children: (0, jsx_runtime_1.jsx)(EditorQuill, __assign({}, props, { ref: ref, value: field.value || "", handleOnChange: handleOnChange })) })));
64
+ });
65
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../src/ui/components/form/text-editor/component.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAAmC;AAEnC,iCAAiC;AACjC,yDAAkC;AAElC,kDAA+C;AAC/C,IAAM,WAAW,GAAG,IAAA,iBAAO,EAAC,cAAM,OAAA,iEAAO,SAAS,OAAE,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,WAAW,EAAb,CAAa,CAAC,EAA1C,CAA0C,EAAE;IAC5E,OAAO,EAAE,cAAM,OAAA,yDAAqB,EAArB,CAAqB;IACpC,GAAG,EAAE,KAAK;CACX,CAAC,CAAC;AAUU,QAAA,UAAU,GAAG,IAAA,kBAAU,EAClC,UAAC,KAAK,EAAE,GAAG;IACH,IAAA,KAAqB,IAAA,iBAAQ,EAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAA1D,KAAK,QAAA,EAAI,OAAO,QAA0C,CAAC;IAClE,IAAM,cAAc,GAAG,UAAC,GAAW,IAAK,OAAA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAArB,CAAqB,CAAC;IAE9D,OAAO,CACL,uBAAC,4BAAY,eAAM,KAAY,cAC7B,uBAAC,WAAW,eACN,KAAK,IACT,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EACxB,cAAc,EAAE,cAAc,IAC9B,IACW,CAChB,CAAC;AACJ,CAAC,CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function useTextEditor(): {
2
+ handleInsert: (text: string) => void;
3
+ handleEditorReady: (insert: any) => void;
4
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTextEditor = useTextEditor;
4
+ var react_1 = require("react");
5
+ function useTextEditor() {
6
+ var _a = (0, react_1.useState)(null), insertTextFunction = _a[0], setInsertTextFunction = _a[1];
7
+ var handleInsert = function (text) {
8
+ if (insertTextFunction) {
9
+ insertTextFunction(text);
10
+ }
11
+ else {
12
+ console.warn("Insert text function not yet available (editor might not be ready).");
13
+ }
14
+ };
15
+ var handleEditorReady = (0, react_1.useCallback)(function (insert) {
16
+ setInsertTextFunction(function () { return insert; });
17
+ }, []);
18
+ return { handleInsert: handleInsert, handleEditorReady: handleEditorReady };
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/ui/components/form/text-editor/hook/index.ts"],"names":[],"mappings":";;AAEA,sCAgBC;AAlBD,+BAA8C;AAE9C,SAAgB,aAAa;IACnB,IAAA,KAA8C,IAAA,gBAAQ,EAAkC,IAAI,CAAC,EAA5F,kBAAkB,QAAA,EAAE,qBAAqB,QAAmD,CAAC;IAEpG,IAAM,YAAY,GAAG,UAAC,IAAY;QAC9B,IAAI,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACxF,CAAC;IACL,CAAC,CAAC;IAEF,IAAM,iBAAiB,GAAG,IAAA,mBAAW,EAAC,UAAC,MAAM;QACzC,qBAAqB,CAAC,cAAM,OAAA,MAAM,EAAN,CAAM,CAAC,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,YAAY,cAAA,EAAE,iBAAiB,mBAAA,EAAE,CAAA;AAC9C,CAAC"}
@@ -1,5 +1,3 @@
1
- import { InputProps } from '../interfaces.js';
2
- export type TextEditorProps = {
3
- disableToolbar?: boolean;
4
- };
5
- export declare function TextEditor(props: InputProps & TextEditorProps): import("react/jsx-runtime").JSX.Element;
1
+ export * from "./component.js";
2
+ export * from "./hook/index.js";
3
+ export * from "./quill.js";
@@ -1,15 +1,4 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
3
  if (k2 === undefined) k2 = k;
15
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -21,46 +10,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
21
10
  if (k2 === undefined) k2 = k;
22
11
  o[k2] = m[k];
23
12
  }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || (function () {
30
- var ownKeys = function(o) {
31
- ownKeys = Object.getOwnPropertyNames || function (o) {
32
- var ar = [];
33
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
- return ar;
35
- };
36
- return ownKeys(o);
37
- };
38
- return function (mod) {
39
- if (mod && mod.__esModule) return mod;
40
- var result = {};
41
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
- __setModuleDefault(result, mod);
43
- return result;
44
- };
45
- })();
46
- var __importDefault = (this && this.__importDefault) || function (mod) {
47
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
48
15
  };
49
16
  Object.defineProperty(exports, "__esModule", { value: true });
50
- exports.TextEditor = TextEditor;
51
- var jsx_runtime_1 = require("react/jsx-runtime");
52
- var formik_1 = require("formik");
53
- var input_control_1 = require("../input-control/index.js");
54
- var dynamic_1 = __importDefault(require("next/dynamic"));
55
- var EditorQuill = (0, dynamic_1.default)(function () { return Promise.resolve().then(function () { return __importStar(require("./quill.js")); }).then(function (r) { return r.EditorQuill; }); }, {
56
- loading: function () { return (0, jsx_runtime_1.jsx)("div", { children: "loading..." }); },
57
- ssr: false,
58
- });
59
- function TextEditor(props) {
60
- var _a = (0, formik_1.useField)({ name: props.name }), field = _a[0], _ = _a[1], helpers = _a[2];
61
- var handleOnChange = function (value) {
62
- helpers.setValue(value);
63
- };
64
- return ((0, jsx_runtime_1.jsx)(input_control_1.InputControl, __assign({}, props, { children: (0, jsx_runtime_1.jsx)(EditorQuill, __assign({}, props, { value: field.value || "", handleOnChange: handleOnChange })) })));
65
- }
17
+ __exportStar(require("./component.js"), exports);
18
+ __exportStar(require("./hook/index.js"), exports);
19
+ __exportStar(require("./quill.js"), exports);
66
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/ui/components/form/text-editor/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,gCAYC;;AA9BD,iCAAiC;AAEjC,kDAA+C;AAK/C,yDAAkC;AAElC,IAAM,WAAW,GAAG,IAAA,iBAAO,EAAC,cAAM,OAAA,iEAAO,SAAS,OAAE,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,WAAW,EAAb,CAAa,CAAC,EAA1C,CAA0C,EAAE;IAC5E,OAAO,EAAE,cAAM,OAAA,yDAAqB,EAArB,CAAqB;IACpC,GAAG,EAAE,KAAK;CACX,CAAC,CAAC;AAMH,SAAgB,UAAU,CAAC,KAAmC;IACtD,IAAA,KAAsB,IAAA,iBAAQ,EAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAnD,KAAK,QAAA,EAAE,CAAC,QAAA,EAAE,OAAO,QAAkC,CAAA;IAE1D,IAAM,cAAc,GAAG,UAAC,KAAa;QACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,OAAO,CACH,uBAAC,4BAAY,eAAK,KAAK,cACrB,uBAAC,WAAW,eAAK,KAAK,IAAG,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAG,cAAc,EAAE,cAAc,IAAI,IACzE,CAClB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/ui/components/form/text-editor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,yCAAuB;AACvB,0CAAuB"}
@@ -1,5 +1,22 @@
1
- import { TextEditorProps } from './index.js';
2
- export declare function EditorQuill(props: {
3
- value?: string;
4
- handleOnChange: (value: string) => void;
5
- } & TextEditorProps): import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ import { TextEditorProps } from "./component.js";
3
+ import "quill/dist/quill.snow.css";
4
+ export interface EditorQuillHandle {
5
+ insertText: (text: string) => void;
6
+ getSelection: () => {
7
+ index: number;
8
+ length: number;
9
+ } | null;
10
+ setSelection: (index: number, length: number) => void;
11
+ }
12
+ export type EditorQuillProps = {
13
+ value: string;
14
+ handleOnChange: (val: string) => void;
15
+ } & TextEditorProps;
16
+ export declare const QuillEditor: React.ForwardRefExoticComponent<{
17
+ value: string;
18
+ handleOnChange: (val: string) => void;
19
+ } & {
20
+ disableToolbar?: boolean;
21
+ onEditorReady?: (insert: EditorQuillHandle["insertText"]) => void;
22
+ } & Partial<import("../index.js").InputProps> & React.RefAttributes<EditorQuillHandle>>;
@@ -1,52 +1,138 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
4
70
  };
5
71
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EditorQuill = EditorQuill;
72
+ exports.QuillEditor = void 0;
7
73
  var jsx_runtime_1 = require("react/jsx-runtime");
8
74
  var react_1 = require("react");
9
- var quill_1 = __importDefault(require("quill"));
10
- var error_boundary_1 = require("../../error-boundary/index.js");
11
- function EditorQuill(props) {
12
- var ID = 'id-' + Math.random().toString(36).substring(2, 9);
75
+ require("quill/dist/quill.snow.css");
76
+ exports.QuillEditor = (0, react_1.forwardRef)(function (_a, ref) {
77
+ var value = _a.value, handleOnChange = _a.handleOnChange, disableToolbar = _a.disableToolbar, onEditorReady = _a.onEditorReady;
78
+ var containerRef = (0, react_1.useRef)(null);
13
79
  var quillRef = (0, react_1.useRef)(null);
80
+ var getEditor = (0, react_1.useCallback)(function () {
81
+ return quillRef.current;
82
+ }, []);
14
83
  (0, react_1.useEffect)(function () {
15
- if (!quillRef.current) {
16
- var modules = {
17
- toolbar: props.disableToolbar
18
- ? false
19
- : [
20
- [{ header: [1, 2, false] }],
21
- ['bold', 'italic', 'underline', 'strike'],
22
- [{ list: 'ordered' }, { list: 'bullet' }],
23
- [{ align: [] }],
24
- ['link', 'image'],
25
- ['clean'],
26
- ],
27
- };
28
- var reference_1 = new quill_1.default('#' + ID, {
29
- theme: 'snow',
30
- modules: modules,
31
- });
32
- quillRef.current = reference_1;
33
- if (props.value) {
34
- reference_1.root.innerHTML = props.value;
35
- }
36
- reference_1.on(quill_1.default.events.TEXT_CHANGE, function () {
37
- var html = reference_1.root.innerHTML;
38
- props.handleOnChange(html);
84
+ var loadQuill = function () { return __awaiter(void 0, void 0, void 0, function () {
85
+ var Quill;
86
+ return __generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("quill")); })];
89
+ case 1:
90
+ Quill = (_a.sent()).default;
91
+ if (!containerRef.current)
92
+ return [2 /*return*/];
93
+ quillRef.current = new Quill(containerRef.current, {
94
+ theme: "snow",
95
+ modules: disableToolbar ? {} : { toolbar: true },
96
+ });
97
+ quillRef.current.on("text-change", function () {
98
+ handleOnChange(quillRef.current.root.innerHTML);
99
+ });
100
+ quillRef.current.root.innerHTML = value;
101
+ onEditorReady === null || onEditorReady === void 0 ? void 0 : onEditorReady(function (text) {
102
+ var editor = quillRef.current;
103
+ editor.focus();
104
+ var sel = editor.getSelection() || { index: editor.getLength(), length: 0 };
105
+ editor.insertText(sel.index, text);
106
+ editor.setSelection(sel.index + text.length, 0);
107
+ });
108
+ return [2 /*return*/];
109
+ }
39
110
  });
40
- }
41
- }, []);
111
+ }); };
112
+ loadQuill();
113
+ }, [onEditorReady]);
42
114
  (0, react_1.useEffect)(function () {
43
- if (quillRef.current && props.value !== undefined) {
44
- var editor = quillRef.current;
45
- if (editor.root.innerHTML !== props.value) {
46
- editor.root.innerHTML = props.value;
47
- }
115
+ if (quillRef.current &&
116
+ quillRef.current.root.innerHTML !== value) {
117
+ var sel = quillRef.current.getSelection();
118
+ quillRef.current.root.innerHTML = value;
119
+ if (sel)
120
+ quillRef.current.setSelection(sel.index, sel.length);
48
121
  }
49
- }, [props.value]);
50
- return ((0, jsx_runtime_1.jsx)(error_boundary_1.Error, { name: 'react-quill', children: (0, jsx_runtime_1.jsx)("div", { id: ID }) }));
51
- }
122
+ }, [value]);
123
+ (0, react_1.useImperativeHandle)(ref, function () { return ({
124
+ insertText: function (text) {
125
+ var editor = getEditor();
126
+ editor.focus();
127
+ var sel = editor.getSelection() || { index: editor.getLength(), length: 0 };
128
+ editor.insertText(sel.index, text);
129
+ editor.setSelection(sel.index + text.length, 0);
130
+ },
131
+ getSelection: function () { return getEditor().getSelection(); },
132
+ setSelection: function (index, length) {
133
+ return getEditor().setSelection(index, length);
134
+ },
135
+ }); }, []);
136
+ return (0, jsx_runtime_1.jsx)("div", { ref: containerRef, style: { minHeight: 200 } });
137
+ });
52
138
  //# sourceMappingURL=quill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quill.js","sourceRoot":"","sources":["../../../../../src/ui/components/form/text-editor/quill.tsx"],"names":[],"mappings":";;;;;AAOA,kCAoDC;;AA3DD,+BAAyC;AAEzC,gDAAyB;AAGzB,uDAA4C;AAE5C,SAAgB,WAAW,CAAC,KAAoF;IAC9G,IAAM,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7D,IAAM,QAAQ,GAAG,IAAA,cAAM,EAAe,IAAI,CAAC,CAAA;IAE3C,IAAA,iBAAS,EAAC;QACR,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,IAAM,OAAO,GAAG;gBACd,OAAO,EAAE,KAAK,CAAC,cAAc;oBAC3B,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC;wBACE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC3B,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;wBACzC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;wBACzC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;wBACf,CAAC,MAAM,EAAE,OAAO,CAAC;wBACjB,CAAC,OAAO,CAAC;qBACV;aACN,CAAA;YAED,IAAM,WAAS,GAAG,IAAI,eAAK,CAAC,GAAG,GAAG,EAAE,EAAE;gBACpC,KAAK,EAAE,MAAM;gBACb,OAAO,SAAA;aACR,CAAC,CAAA;YAGF,QAAQ,CAAC,OAAO,GAAG,WAAS,CAAA;YAE5B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,WAAS,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;YACxC,CAAC;YAED,WAAS,CAAC,EAAE,CAAC,eAAK,CAAC,MAAM,CAAC,WAAW,EAAE;gBACrC,IAAM,IAAI,GAAG,WAAS,CAAC,IAAI,CAAC,SAAS,CAAA;gBACrC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,IAAA,iBAAS,EAAC;QACR,IAAI,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAClD,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAA;YAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjB,OAAO,CACL,uBAAC,sBAAK,IAAC,IAAI,EAAC,aAAa,YACvB,gCAAK,EAAE,EAAE,EAAE,GAAI,GACT,CACT,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"quill.js","sourceRoot":"","sources":["../../../../../src/ui/components/form/text-editor/quill.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinity-forge",
3
- "version": "8.5.1",
3
+ "version": "8.5.2",
4
4
  "description": "codie Library",
5
5
  "main": "./dist/index",
6
6
  "module": "./dist/index",