1 | |
2 | type Confluence = { |
3 | email: string |
4 | apiToken: string |
5 | domain: string |
6 | } |
7 | |
8 | * Update look and feel settings |
9 | * Updates the look and feel settings for the site or for a single space. |
10 | If custom settings exist, they are updated. If no custom settings exist, |
11 | then a set of custom settings is created. |
12 |
|
13 | Note, if a theme is selected for a space, the space look and feel settings |
14 | are provided by the theme and cannot be overridden. |
15 |
|
16 | **[Permissions](https://confluence.atlassian.com/x/_AozKw) required**: |
17 | 'Admin' permission for the space. |
18 | */ |
19 | export async function main( |
20 | auth: Confluence, |
21 | spaceKey: string | undefined, |
22 | body: { |
23 | headings: { color: string } |
24 | links: { color: string } |
25 | menus: { hoverOrFocus: { backgroundColor: string }; color: string } |
26 | header: { |
27 | backgroundColor: string |
28 | button: { backgroundColor: string; color: string } |
29 | primaryNavigation: { |
30 | color: string |
31 | highlightColor?: string |
32 | hoverOrFocus: { backgroundColor: string; color: string } |
33 | } |
34 | secondaryNavigation: { |
35 | color: string |
36 | highlightColor?: string |
37 | hoverOrFocus: { backgroundColor: string; color: string } |
38 | } |
39 | search: { backgroundColor: string; color: string } |
40 | } |
41 | horizontalHeader?: { |
42 | backgroundColor: string |
43 | button?: { backgroundColor: string; color: string } |
44 | primaryNavigation: { |
45 | color?: string |
46 | highlightColor: string |
47 | hoverOrFocus?: { backgroundColor?: string; color?: string } |
48 | } |
49 | secondaryNavigation?: { |
50 | color: string |
51 | highlightColor?: string |
52 | hoverOrFocus: { backgroundColor: string; color: string } |
53 | } |
54 | search?: { backgroundColor: string; color: string } |
55 | } |
56 | content: { |
57 | screen?: { |
58 | background: string |
59 | backgroundAttachment?: string |
60 | backgroundBlendMode?: string |
61 | backgroundClip?: string |
62 | backgroundColor?: string |
63 | backgroundImage?: string |
64 | backgroundOrigin?: string |
65 | backgroundPosition?: string |
66 | backgroundRepeat?: string |
67 | backgroundSize?: string |
68 | layer?: { width?: string; height?: string } |
69 | gutterTop?: string |
70 | gutterRight?: string |
71 | gutterBottom?: string |
72 | gutterLeft?: string |
73 | } |
74 | container?: { |
75 | background: string |
76 | backgroundAttachment?: string |
77 | backgroundBlendMode?: string |
78 | backgroundClip?: string |
79 | backgroundColor: string |
80 | backgroundImage: string |
81 | backgroundOrigin?: string |
82 | backgroundPosition?: string |
83 | backgroundRepeat?: string |
84 | backgroundSize: string |
85 | padding: string |
86 | borderRadius: string |
87 | } |
88 | header?: { |
89 | background: string |
90 | backgroundAttachment?: string |
91 | backgroundBlendMode?: string |
92 | backgroundClip?: string |
93 | backgroundColor: string |
94 | backgroundImage: string |
95 | backgroundOrigin?: string |
96 | backgroundPosition?: string |
97 | backgroundRepeat?: string |
98 | backgroundSize: string |
99 | padding: string |
100 | borderRadius: string |
101 | } |
102 | body?: { |
103 | background: string |
104 | backgroundAttachment?: string |
105 | backgroundBlendMode?: string |
106 | backgroundClip?: string |
107 | backgroundColor: string |
108 | backgroundImage: string |
109 | backgroundOrigin?: string |
110 | backgroundPosition?: string |
111 | backgroundRepeat?: string |
112 | backgroundSize: string |
113 | padding: string |
114 | borderRadius: string |
115 | } |
116 | } |
117 | bordersAndDividers: { color: string } |
118 | spaceReference?: {} |
119 | } |
120 | ) { |
121 | const url = new URL(`https://${auth.domain}/wiki/rest/api/settings/lookandfeel/custom`) |
122 | for (const [k, v] of [['spaceKey', spaceKey]]) { |
123 | if (v !== undefined && v !== '' && k !== undefined) { |
124 | url.searchParams.append(k, v) |
125 | } |
126 | } |
127 | const response = await fetch(url, { |
128 | method: 'POST', |
129 | headers: { |
130 | 'Content-Type': 'application/json', |
131 | Authorization: 'Basic ' + btoa(`${auth.email}:${auth.apiToken}`) |
132 | }, |
133 | body: JSON.stringify(body) |
134 | }) |
135 | if (!response.ok) { |
136 | const text = await response.text() |
137 | throw new Error(`${response.status} ${text}`) |
138 | } |
139 | return await response.json() |
140 | } |
141 |
|