@squiz/resource-browser 1.66.0 → 1.66.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.
- package/CHANGELOG.md +13 -0
- package/lib/PreviewPanel/details/MatrixResource.d.ts +1 -1
- package/lib/PreviewPanel/details/MatrixResource.js +7 -3
- package/lib/index.css +22 -0
- package/package.json +1 -1
- package/src/PreviewPanel/PreviewPanel.spec.tsx +43 -0
- package/src/PreviewPanel/PreviewPanel.stories.tsx +23 -0
- package/src/PreviewPanel/details/MatrixResource.tsx +15 -3
- package/src/PreviewPanel/details/matrix-resource.scss +16 -0
- package/src/ResourceList/sample-resources.json +17 -1
- package/src/ResourcePicker/mock-image-resource.json +2 -2
- package/src/ResourcePicker/resource-picker.scss +1 -1
- package/src/index.scss +9 -0
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# @squiz/resource-browser
|
2
2
|
|
3
|
+
## 1.66.2
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- 6d41052: Added white background to resource picker input to avoid it inheriting the background colour of its parent element.
|
8
|
+
|
9
|
+
## 1.66.1
|
10
|
+
|
11
|
+
### Patch Changes
|
12
|
+
|
13
|
+
- 81c7cba: Image asset previews will now display the image if there is a URL in the returned resource data
|
14
|
+
Also fixes a bug around the selected resource name not having break-word applied so the filename was not wrapping as expected
|
15
|
+
|
3
16
|
## 1.66.0
|
4
17
|
|
5
18
|
### Minor Changes
|
@@ -3,5 +3,5 @@ import { Resource } from '../../types';
|
|
3
3
|
type MatrixResourceProps = {
|
4
4
|
resource: Resource;
|
5
5
|
};
|
6
|
-
declare const MatrixResource: ({ resource: { id, type, name, status } }: MatrixResourceProps) => React.JSX.Element;
|
6
|
+
declare const MatrixResource: ({ resource: { id, type, name, status, url } }: MatrixResourceProps) => React.JSX.Element;
|
7
7
|
export default MatrixResource;
|
@@ -6,11 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
|
8
8
|
const StatusIndicator_1 = __importDefault(require("../../StatusIndicator/StatusIndicator"));
|
9
|
-
const
|
9
|
+
const ImageThumb = ({ url, name }) => {
|
10
|
+
return (react_1.default.createElement("div", { className: "checkered-bg w-full h-[164px] overflow-hidden flex justify-center items-center" },
|
11
|
+
react_1.default.createElement("img", { src: url, className: "max-w-full max-h-full", alt: name })));
|
12
|
+
};
|
13
|
+
const MatrixResource = ({ resource: { id, type, name, status, url } }) => {
|
10
14
|
return (react_1.default.createElement("div", null,
|
11
15
|
react_1.default.createElement("div", { className: "flex flex-col items-center text-gray-800 mt-7 mx-5 pb-4 border-b border-gray-300" },
|
12
|
-
react_1.default.createElement(generic_browser_lib_1.Icon, { icon: type.code, resourceSource: "matrix", className: "w-14 h-14" }),
|
13
|
-
react_1.default.createElement("div", { className: "mt-4 font-semibold text-base" }, name)),
|
16
|
+
type.code === 'image' && url ? (react_1.default.createElement(ImageThumb, { url: url, name: name })) : (react_1.default.createElement(generic_browser_lib_1.Icon, { icon: type.code, resourceSource: "matrix", className: "w-14 h-14" })),
|
17
|
+
react_1.default.createElement("div", { className: "mt-4 font-semibold text-base break-word" }, name)),
|
14
18
|
react_1.default.createElement("div", { className: "text-gray-800 mx-6 mt-4" },
|
15
19
|
react_1.default.createElement("dl", { className: "flex flex-col text-sm" },
|
16
20
|
react_1.default.createElement("div", { className: "flex mb-2" },
|
package/lib/index.css
CHANGED
@@ -565,6 +565,9 @@
|
|
565
565
|
.squiz-rb-scope .h-9 {
|
566
566
|
height: 2.25rem;
|
567
567
|
}
|
568
|
+
.squiz-rb-scope .h-\[164px\] {
|
569
|
+
height: 164px;
|
570
|
+
}
|
568
571
|
.squiz-rb-scope .h-\[20px\] {
|
569
572
|
height: 20px;
|
570
573
|
}
|
@@ -583,6 +586,9 @@
|
|
583
586
|
.squiz-rb-scope .max-h-80 {
|
584
587
|
max-height: 20rem;
|
585
588
|
}
|
589
|
+
.squiz-rb-scope .max-h-full {
|
590
|
+
max-height: 100%;
|
591
|
+
}
|
586
592
|
.squiz-rb-scope .min-h-\[64px\] {
|
587
593
|
min-height: 64px;
|
588
594
|
}
|
@@ -643,6 +649,9 @@
|
|
643
649
|
.squiz-rb-scope .max-w-\[50rem\] {
|
644
650
|
max-width: 50rem;
|
645
651
|
}
|
652
|
+
.squiz-rb-scope .max-w-full {
|
653
|
+
max-width: 100%;
|
654
|
+
}
|
646
655
|
.squiz-rb-scope .flex-1 {
|
647
656
|
flex: 1 1 0%;
|
648
657
|
}
|
@@ -988,6 +997,8 @@
|
|
988
997
|
display: grid;
|
989
998
|
grid-template-columns: 24px 1fr;
|
990
999
|
gap: 0.5rem;
|
1000
|
+
--tw-bg-opacity: 1;
|
1001
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
991
1002
|
border-width: 2px;
|
992
1003
|
--tw-border-opacity: 1;
|
993
1004
|
border-color: rgb(224 224 224 / var(--tw-border-opacity));
|
@@ -1019,6 +1030,13 @@
|
|
1019
1030
|
--tw-bg-opacity: 1;
|
1020
1031
|
background-color: rgb(247 247 247 / var(--tw-bg-opacity));
|
1021
1032
|
}
|
1033
|
+
.squiz-rb-scope .checkered-bg {
|
1034
|
+
--tw-bg-opacity: 1;
|
1035
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
1036
|
+
background-size: 24px 24px;
|
1037
|
+
background-position: 0 0, 12px 12px;
|
1038
|
+
background-image: linear-gradient(45deg, #e0e0e0 25%, transparent 25%, transparent 75%, #e0e0e0 75%, #e0e0e0), linear-gradient(45deg, #e0e0e0 25%, transparent 25%, transparent 75%, #e0e0e0 75%, #e0e0e0);
|
1039
|
+
}
|
1022
1040
|
.squiz-rb-scope .spinner {
|
1023
1041
|
display: inline-block;
|
1024
1042
|
border-radius: 9999px;
|
@@ -1083,6 +1101,10 @@
|
|
1083
1101
|
.squiz-rb-scope .p-4\.5 {
|
1084
1102
|
padding: 18px;
|
1085
1103
|
}
|
1104
|
+
.squiz-rb-scope .break-word {
|
1105
|
+
word-break: break-word;
|
1106
|
+
overflow-wrap: anywhere;
|
1107
|
+
}
|
1086
1108
|
.squiz-rb-scope .before\:fixed::before {
|
1087
1109
|
content: var(--tw-content);
|
1088
1110
|
position: fixed;
|
package/package.json
CHANGED
@@ -38,6 +38,22 @@ function mockResource(properties: Partial<Resource> = {}): Resource {
|
|
38
38
|
};
|
39
39
|
}
|
40
40
|
|
41
|
+
function mockImageResource(properties: Partial<Resource> = {}): Resource {
|
42
|
+
return {
|
43
|
+
id: 'test-image-resource',
|
44
|
+
name: 'Test image resource',
|
45
|
+
type: { code: 'image', name: 'Image' },
|
46
|
+
status: { code: 'live', name: 'Live' },
|
47
|
+
url: 'https://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
48
|
+
urls: [
|
49
|
+
'https://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
50
|
+
'http://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
51
|
+
],
|
52
|
+
childCount: 0,
|
53
|
+
...properties,
|
54
|
+
};
|
55
|
+
}
|
56
|
+
|
41
57
|
describe('PreviewPanel', () => {
|
42
58
|
it('Renders a message when no item selected', async () => {
|
43
59
|
const onSelect = jest.fn();
|
@@ -65,6 +81,33 @@ describe('PreviewPanel', () => {
|
|
65
81
|
});
|
66
82
|
});
|
67
83
|
|
84
|
+
it('Renders an image when an image is selected', async () => {
|
85
|
+
const onSelect = jest.fn();
|
86
|
+
const onClose = jest.fn();
|
87
|
+
const resource = mockImageResource();
|
88
|
+
|
89
|
+
render(
|
90
|
+
<PreviewPanelTestWrapper
|
91
|
+
constructFunction={(previewModalState, overlayProps) => {
|
92
|
+
return (
|
93
|
+
<PreviewPanel
|
94
|
+
resource={resource}
|
95
|
+
allowedTypes={undefined}
|
96
|
+
modalState={previewModalState}
|
97
|
+
previewModalOverlayProps={overlayProps}
|
98
|
+
onSelect={onSelect}
|
99
|
+
onClose={onClose}
|
100
|
+
/>
|
101
|
+
);
|
102
|
+
}}
|
103
|
+
/>,
|
104
|
+
);
|
105
|
+
|
106
|
+
await waitFor(() => {
|
107
|
+
expect(screen.queryByAltText(resource.name)).toBeTruthy();
|
108
|
+
});
|
109
|
+
});
|
110
|
+
|
68
111
|
it('Renders tablet / desktop very above 640px', async () => {
|
69
112
|
const onSelect = jest.fn();
|
70
113
|
const onClose = jest.fn();
|
@@ -46,6 +46,29 @@ Primary.args = {
|
|
46
46
|
allowedTypes: undefined,
|
47
47
|
};
|
48
48
|
|
49
|
+
export const ImageAsset = Template.bind({});
|
50
|
+
ImageAsset.args = {
|
51
|
+
resource: {
|
52
|
+
id: '104',
|
53
|
+
name: 'Little goat face',
|
54
|
+
type: {
|
55
|
+
code: 'image',
|
56
|
+
name: 'Image',
|
57
|
+
},
|
58
|
+
status: {
|
59
|
+
code: 'live',
|
60
|
+
name: 'Live',
|
61
|
+
},
|
62
|
+
url: 'https://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
63
|
+
urls: [
|
64
|
+
'https://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
65
|
+
'http://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg',
|
66
|
+
],
|
67
|
+
childCount: 0,
|
68
|
+
},
|
69
|
+
allowedTypes: undefined,
|
70
|
+
};
|
71
|
+
|
49
72
|
export const NoSelected = Template.bind({});
|
50
73
|
NoSelected.args = {
|
51
74
|
...Primary.args,
|
@@ -8,12 +8,24 @@ type MatrixResourceProps = {
|
|
8
8
|
resource: Resource;
|
9
9
|
};
|
10
10
|
|
11
|
-
const
|
11
|
+
const ImageThumb = ({ url, name }: { url: string; name: string }) => {
|
12
|
+
return (
|
13
|
+
<div className="checkered-bg w-full h-[164px] overflow-hidden flex justify-center items-center">
|
14
|
+
<img src={url} className="max-w-full max-h-full" alt={name} />
|
15
|
+
</div>
|
16
|
+
);
|
17
|
+
};
|
18
|
+
|
19
|
+
const MatrixResource = ({ resource: { id, type, name, status, url } }: MatrixResourceProps) => {
|
12
20
|
return (
|
13
21
|
<div>
|
14
22
|
<div className="flex flex-col items-center text-gray-800 mt-7 mx-5 pb-4 border-b border-gray-300">
|
15
|
-
|
16
|
-
|
23
|
+
{type.code === 'image' && url ? (
|
24
|
+
<ImageThumb url={url} name={name} />
|
25
|
+
) : (
|
26
|
+
<Icon icon={type.code as IconOptions} resourceSource="matrix" className="w-14 h-14" />
|
27
|
+
)}
|
28
|
+
<div className="mt-4 font-semibold text-base break-word">{name}</div>
|
17
29
|
</div>
|
18
30
|
<div className="text-gray-800 mx-6 mt-4">
|
19
31
|
<dl className="flex flex-col text-sm">
|
@@ -0,0 +1,16 @@
|
|
1
|
+
$sds-grey-300: #e0e0e0;
|
2
|
+
|
3
|
+
.checkered-bg {
|
4
|
+
@apply bg-white;
|
5
|
+
background-size: 24px 24px;
|
6
|
+
background-position: 0 0, 12px 12px;
|
7
|
+
background-image: linear-gradient(
|
8
|
+
45deg,
|
9
|
+
$sds-grey-300 25%,
|
10
|
+
transparent 25%,
|
11
|
+
transparent 75%,
|
12
|
+
$sds-grey-300 75%,
|
13
|
+
$sds-grey-300
|
14
|
+
),
|
15
|
+
linear-gradient(45deg, $sds-grey-300 25%, transparent 25%, transparent 75%, $sds-grey-300 75%, $sds-grey-300);
|
16
|
+
}
|
@@ -75,7 +75,9 @@
|
|
75
75
|
"name": "Live"
|
76
76
|
},
|
77
77
|
"name": "Image",
|
78
|
-
"childCount": 0
|
78
|
+
"childCount": 0,
|
79
|
+
"url": "https://picsum.photos/200/150",
|
80
|
+
"urls": ["https://picsum.photos/200/150", "http://picsum.photos/200/150"]
|
79
81
|
},
|
80
82
|
{
|
81
83
|
"id": "105",
|
@@ -470,6 +472,20 @@
|
|
470
472
|
"name": "Asset with an even longer title to make it is so long that it causes the container to grow in size. It is truly really just so long and I don't know what else I could possibly say about it to express just how long it is.",
|
471
473
|
"childCount": 456
|
472
474
|
},
|
475
|
+
{
|
476
|
+
"id": "903",
|
477
|
+
"type": {
|
478
|
+
"code": "image",
|
479
|
+
"name": "Image"
|
480
|
+
},
|
481
|
+
"status": {
|
482
|
+
"code": "live",
|
483
|
+
"name": "Live"
|
484
|
+
},
|
485
|
+
"name": "image_asset_with_a_silly_long_image_file_name_to_check_that_it_does_not_break_out_of_the_layout.jpg.",
|
486
|
+
"childCount": 456,
|
487
|
+
"url": "https://www.rspcasa.org.au/wp-content/uploads/2020/10/Baby-goat-in-tree.jpg"
|
488
|
+
},
|
473
489
|
{
|
474
490
|
"id": "904",
|
475
491
|
"type": {
|
@@ -9,8 +9,8 @@
|
|
9
9
|
"code": "under_construction",
|
10
10
|
"name": "Under Construction"
|
11
11
|
},
|
12
|
-
"url": "",
|
13
|
-
"urls": [],
|
12
|
+
"url": "https://picsum.photos/200/150",
|
13
|
+
"urls": ["https://picsum.photos/200/150", "http://picsum.photos/200/150"],
|
14
14
|
"childCount": 0,
|
15
15
|
"squizImage": {
|
16
16
|
"name": "Fancy music",
|
package/src/index.scss
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
// Components
|
7
7
|
@import './ResourceBreadcrumb/resource-breadcrumb';
|
8
8
|
@import './ResourcePicker/resource-picker';
|
9
|
+
@import './PreviewPanel/details/matrix-resource';
|
9
10
|
@import '@squiz/generic-browser-lib/src/Spinner/spinner';
|
10
11
|
@import '@squiz/generic-browser-lib/src/Skeleton/skeleton';
|
11
12
|
|
@@ -22,3 +23,11 @@ svg {
|
|
22
23
|
.p-4\.5 {
|
23
24
|
padding: 18px;
|
24
25
|
}
|
26
|
+
|
27
|
+
// In tailwind there is no break-word as it is deprecated, but break-words which is slightly different does not work here, so I have added the suggested combination here
|
28
|
+
// https://v1.tailwindcss.com/docs/word-break
|
29
|
+
// https://github.com/tailwindlabs/tailwindcss/discussions/2213
|
30
|
+
.break-word {
|
31
|
+
word-break: break-word;
|
32
|
+
overflow-wrap: anywhere;
|
33
|
+
}
|