dce-reactkit 3.9.3 → 3.9.4-beta.1
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/cjs/index.js +43 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/AppWrapper.d.ts +24 -0
- package/dist/cjs/types/types/ModalType.d.ts +1 -0
- package/dist/esm/index.js +43 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/AppWrapper.d.ts +24 -0
- package/dist/esm/types/types/ModalType.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/components/AppWrapper.tsx +216 -0
- package/src/components/Modal/index.tsx +3 -0
- package/src/types/ModalType.tsx +1 -0
|
@@ -44,6 +44,30 @@ export declare const confirm: (title: string, text: string, opts?: {
|
|
|
44
44
|
cancelButtonText?: string;
|
|
45
45
|
cancelButtonVariant?: Variant;
|
|
46
46
|
}) => Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Show a prompt modal asking the user for input
|
|
49
|
+
* @author Yuen Ler Chow
|
|
50
|
+
* @param title the title text to display at the top of the prompt
|
|
51
|
+
* @param text the text to display in the prompt
|
|
52
|
+
* @param [opts={}] additional options for the prompt dialog
|
|
53
|
+
* @param [opts.placeholder] the placeholder text for the input field
|
|
54
|
+
* @param [opts.defaultText] the default text for the input field
|
|
55
|
+
* @param [opts.confirmButtonText=Okay] the text of the confirm button
|
|
56
|
+
* @param [opts.confirmButtonVariant=Variant.Dark] the variant of the confirm button
|
|
57
|
+
* @param [opts.cancelButtonText=Cancel] the text of the cancel button
|
|
58
|
+
* @param [opts.cancelButtonVariant=Variant.Secondary] the variant of the cancel button
|
|
59
|
+
* @returns Promise that resolves with the input string or null if canceled
|
|
60
|
+
*/
|
|
61
|
+
export declare const prompt: (title: string, text: string, currentInputFieldText: string, opts?: {
|
|
62
|
+
placeholder?: string | undefined;
|
|
63
|
+
defaultText?: string | undefined;
|
|
64
|
+
confirmButtonText?: string | undefined;
|
|
65
|
+
confirmButtonVariant?: Variant | undefined;
|
|
66
|
+
cancelButtonText?: string | undefined;
|
|
67
|
+
cancelButtonVariant?: Variant | undefined;
|
|
68
|
+
minNumChars?: number | undefined;
|
|
69
|
+
findValidationError?: ((text: string) => string | undefined) | undefined;
|
|
70
|
+
} | undefined) => Promise<string | null>;
|
|
47
71
|
/**
|
|
48
72
|
* Show a fatal error message
|
|
49
73
|
* @author Gabe Abrams
|
package/dist/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -240,6 +240,124 @@ export const confirm = async (
|
|
|
240
240
|
});
|
|
241
241
|
};
|
|
242
242
|
|
|
243
|
+
/*----------------------------------------*/
|
|
244
|
+
/* --------------- Prompt -------------- */
|
|
245
|
+
/*----------------------------------------*/
|
|
246
|
+
|
|
247
|
+
// Stored copies of setters
|
|
248
|
+
let setPromptInfo: (
|
|
249
|
+
info:
|
|
250
|
+
| undefined
|
|
251
|
+
| {
|
|
252
|
+
title: string;
|
|
253
|
+
text: string;
|
|
254
|
+
currentInputFieldText: string,
|
|
255
|
+
opts: {
|
|
256
|
+
placeholder?: string,
|
|
257
|
+
defaultText?: string,
|
|
258
|
+
confirmButtonText?: string,
|
|
259
|
+
confirmButtonVariant?: Variant,
|
|
260
|
+
cancelButtonText?: string,
|
|
261
|
+
cancelButtonVariant?: Variant,
|
|
262
|
+
minNumChars?: number,
|
|
263
|
+
findValidationError?: (text: string) => string | undefined,
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
) => void;
|
|
267
|
+
|
|
268
|
+
// Function to call when prompt is closed
|
|
269
|
+
let onPromptClosed: (result: string | null) => void;
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Show a prompt modal asking the user for input
|
|
273
|
+
* @author Yuen Ler Chow
|
|
274
|
+
* @param title the title text to display at the top of the prompt
|
|
275
|
+
* @param text the text to display in the prompt
|
|
276
|
+
* @param [opts={}] additional options for the prompt dialog
|
|
277
|
+
* @param [opts.placeholder] the placeholder text for the input field
|
|
278
|
+
* @param [opts.defaultText] the default text for the input field
|
|
279
|
+
* @param [opts.confirmButtonText=Okay] the text of the confirm button
|
|
280
|
+
* @param [opts.confirmButtonVariant=Variant.Dark] the variant of the confirm button
|
|
281
|
+
* @param [opts.cancelButtonText=Cancel] the text of the cancel button
|
|
282
|
+
* @param [opts.cancelButtonVariant=Variant.Secondary] the variant of the cancel button
|
|
283
|
+
* @returns Promise that resolves with the input string or null if canceled
|
|
284
|
+
*/
|
|
285
|
+
export const prompt = async (
|
|
286
|
+
title: string,
|
|
287
|
+
text: string,
|
|
288
|
+
currentInputFieldText: string,
|
|
289
|
+
opts?: {
|
|
290
|
+
placeholder?: string,
|
|
291
|
+
defaultText?: string,
|
|
292
|
+
confirmButtonText?: string,
|
|
293
|
+
confirmButtonVariant?: Variant,
|
|
294
|
+
cancelButtonText?: string,
|
|
295
|
+
cancelButtonVariant?: Variant,
|
|
296
|
+
minNumChars?: number,
|
|
297
|
+
findValidationError?: (text: string) => string | undefined,
|
|
298
|
+
},
|
|
299
|
+
): Promise<string | null> => {
|
|
300
|
+
// Wait for helper to exist
|
|
301
|
+
await waitForHelper(() => {
|
|
302
|
+
return !!setPromptInfo;
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Fallback if prompt is not available
|
|
306
|
+
if (!setPromptInfo) {
|
|
307
|
+
const resultPassesValidation = false;
|
|
308
|
+
while (!resultPassesValidation) {
|
|
309
|
+
// eslint-disable-next-line no-alert
|
|
310
|
+
const result = window.prompt(
|
|
311
|
+
`${title}\n\n${text}`,
|
|
312
|
+
opts?.defaultText ?? '',
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
if (result === null) {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Validate min num chars
|
|
320
|
+
const minNumCharsValidationError = (
|
|
321
|
+
(opts?.minNumChars && result.length < opts.minNumChars)
|
|
322
|
+
? `Please enter at least ${opts.minNumChars} characters.`
|
|
323
|
+
: undefined
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
// Run custom validation
|
|
327
|
+
const customValidationError = (
|
|
328
|
+
opts?.findValidationError
|
|
329
|
+
&& opts.findValidationError(result)
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
// Show validation issue
|
|
333
|
+
if (minNumCharsValidationError || customValidationError) {
|
|
334
|
+
alert(
|
|
335
|
+
'Invalid Input',
|
|
336
|
+
`${minNumCharsValidationError ?? ''} ${customValidationError ?? ''}`,
|
|
337
|
+
);
|
|
338
|
+
} else {
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Return promise that resolves with result of prompt
|
|
345
|
+
return new Promise((resolve) => {
|
|
346
|
+
// Setup handler
|
|
347
|
+
onPromptClosed = (result: string | null) => {
|
|
348
|
+
resolve(result);
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// Show the prompt
|
|
352
|
+
setPromptInfo({
|
|
353
|
+
title,
|
|
354
|
+
text,
|
|
355
|
+
currentInputFieldText,
|
|
356
|
+
opts: (opts ?? {}),
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
};
|
|
360
|
+
|
|
243
361
|
/*----------------------------------------*/
|
|
244
362
|
/* ------------- Fatal Error ------------ */
|
|
245
363
|
/*----------------------------------------*/
|
|
@@ -465,6 +583,27 @@ const AppWrapper: React.FC<Props> = (props: Props): React.ReactElement => {
|
|
|
465
583
|
>(undefined);
|
|
466
584
|
setConfirmInfo = setConfirmInfoInner;
|
|
467
585
|
|
|
586
|
+
// Prompt
|
|
587
|
+
const [promptInfo, setPromptInfoInner] = useState<
|
|
588
|
+
| undefined
|
|
589
|
+
| {
|
|
590
|
+
title: string,
|
|
591
|
+
text: string,
|
|
592
|
+
currentInputFieldText: string,
|
|
593
|
+
opts: {
|
|
594
|
+
placeholder?: string,
|
|
595
|
+
defaultText?: string,
|
|
596
|
+
confirmButtonText?: string,
|
|
597
|
+
confirmButtonVariant?: Variant,
|
|
598
|
+
cancelButtonText?: string,
|
|
599
|
+
cancelButtonVariant?: Variant,
|
|
600
|
+
minNumChars?: number,
|
|
601
|
+
findValidationError?: (text: string) => string | undefined,
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
>(undefined);
|
|
605
|
+
setPromptInfo = setPromptInfoInner;
|
|
606
|
+
|
|
468
607
|
// Session expired
|
|
469
608
|
const [
|
|
470
609
|
sessionHasExpired,
|
|
@@ -531,6 +670,83 @@ const AppWrapper: React.FC<Props> = (props: Props): React.ReactElement => {
|
|
|
531
670
|
);
|
|
532
671
|
}
|
|
533
672
|
|
|
673
|
+
/* ------------- Prompt ------------ */
|
|
674
|
+
|
|
675
|
+
if (promptInfo) {
|
|
676
|
+
// Run min char validation
|
|
677
|
+
const minNumCharsValidationError = (
|
|
678
|
+
(
|
|
679
|
+
promptInfo.opts.minNumChars
|
|
680
|
+
&& promptInfo.currentInputFieldText.length < promptInfo.opts.minNumChars
|
|
681
|
+
)
|
|
682
|
+
? `Please enter at least ${promptInfo.opts.minNumChars} characters.`
|
|
683
|
+
: undefined
|
|
684
|
+
);
|
|
685
|
+
|
|
686
|
+
// Run custom validation
|
|
687
|
+
const customValidationError = (
|
|
688
|
+
promptInfo.opts.findValidationError
|
|
689
|
+
&& promptInfo.opts.findValidationError(promptInfo.currentInputFieldText)
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
modal = (
|
|
693
|
+
<ModalForWrapper
|
|
694
|
+
key={`prompt-${promptInfo.title}-${promptInfo.text}`}
|
|
695
|
+
title={promptInfo.title}
|
|
696
|
+
// only show the cancel button if there is a validation error
|
|
697
|
+
type={(
|
|
698
|
+
(customValidationError || minNumCharsValidationError)
|
|
699
|
+
? ModalType.Cancel
|
|
700
|
+
: ModalType.OkayCancel
|
|
701
|
+
)}
|
|
702
|
+
okayLabel={promptInfo.opts.confirmButtonText}
|
|
703
|
+
okayVariant={promptInfo.opts.confirmButtonVariant}
|
|
704
|
+
cancelLabel={promptInfo.opts.cancelButtonText}
|
|
705
|
+
cancelVariant={promptInfo.opts.cancelButtonVariant}
|
|
706
|
+
onClose={(buttonType) => {
|
|
707
|
+
const result = (
|
|
708
|
+
buttonType === ModalButtonType.Okay
|
|
709
|
+
? promptInfo.currentInputFieldText
|
|
710
|
+
: null
|
|
711
|
+
);
|
|
712
|
+
|
|
713
|
+
setPromptInfo(undefined);
|
|
714
|
+
|
|
715
|
+
if (onPromptClosed) {
|
|
716
|
+
onPromptClosed(result);
|
|
717
|
+
}
|
|
718
|
+
}}
|
|
719
|
+
onTopOfOtherModals
|
|
720
|
+
dontAllowBackdropExit
|
|
721
|
+
>
|
|
722
|
+
<div className="d-flex flex-column align-items-center">
|
|
723
|
+
<p>{promptInfo.text}</p>
|
|
724
|
+
<input
|
|
725
|
+
type="text"
|
|
726
|
+
placeholder={promptInfo.opts.placeholder}
|
|
727
|
+
value={promptInfo.currentInputFieldText}
|
|
728
|
+
onChange={(e) => {
|
|
729
|
+
return setPromptInfo({
|
|
730
|
+
...promptInfo,
|
|
731
|
+
currentInputFieldText: e.target.value,
|
|
732
|
+
});
|
|
733
|
+
}}
|
|
734
|
+
/>
|
|
735
|
+
{minNumCharsValidationError && (
|
|
736
|
+
<div className="text-danger bg-danger bg-opacity-25 p-2 m-1 rounded">
|
|
737
|
+
{minNumCharsValidationError}
|
|
738
|
+
</div>
|
|
739
|
+
)}
|
|
740
|
+
{customValidationError && (
|
|
741
|
+
<div className="text-danger bg-danger bg-opacity-25 p-2 m-1 rounded">
|
|
742
|
+
{customValidationError}
|
|
743
|
+
</div>
|
|
744
|
+
)}
|
|
745
|
+
</div>
|
|
746
|
+
</ModalForWrapper>
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
|
|
534
750
|
/* ------ Custom Modal Portals ------ */
|
|
535
751
|
|
|
536
752
|
// Custom modal portals
|