PageSourceSearch

https://busbar-webapp-embedded-v2.onrender.com/

html busbar-webapp-embedded-v2.onrender.com collected 2026-10-03 11:39:19 UTC 69,585 bytes, 1,156 lines download raw bytes

1<!DOCTYPE html>
2<html lang="no">
3<head>
4  <meta charset="utf-8" />
5  <meta name="viewport" content="width=device-width, initial-scale=1" />
6  <meta name="busbar-api-base" content="https://busbar-webapp-embedded-v2.onrender.com">
7  <title>Prosjektstyringsverkt&oslash;y</title>
8  <link rel="icon" type="image/png" href="assets/Busbar_lyn_fylt.png">
9  <link rel="stylesheet" href="styles.css">
10  <link rel="stylesheet" href="font.css">
11  
11<script src="assets/vendor/msal-browser.min.js"></script>
11
12  <style>
13    :root{
14      --bg:#f1f0f0; --text:#f1f0f0; --muted:#9fb0c6;
15      --card:#08172e; --card-border:#435A7F;
16      --input:#2B3A58; --input-border:#435A7F;
17      --accent:#2B3A58; --accent-weak:#435A7F;
18      --warning:#febe10; --placeholder:#6b7280;
19    }
20    header h1{margin:0 0 6px 0; color:var(--muted)}
21
22    .logo{display:block;width:180px;max-width:100%;height:auto;background:transparent;padding:0}
23    .modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,0.6);display:none;align-items:center;justify-content:center;z-index:50}
24    .modal{background:var(--card);border:1px solid var(--card-border);border-radius:12px;padding:16px;min-width:320px;max-width:90vw}
25    .modal h3{margin:0 0 8px 0}
26    .modal p{margin:0 0 12px 0;color:var(--muted)}
27    .actions{display:flex;gap:8px;justify-content:flex-end}
28    .btn{padding:10px 14px;background:var(--accent);border:1px solid var(--accent);border-radius:10px;color:#fff;cursor:pointer}
29    .btn.alt{background:var(--input);border-color:var(--input-border)}
30  </style>
31</head>
32<body>
33  <svg class="app-icon-sprite" aria-hidden="true" focusable="false">
34    <symbol id="icon-dashboard" viewBox="0 0 24 24"><path d="M4 13h6V4H4v9Zm10 7h6V4h-6v16ZM4 20h6v-5H4v5Z"/></symbol>
35    <symbol id="icon-projects" viewBox="0 0 24 24"><path d="M3 6.5A2.5 2.5 0 0 1 5.5 4H10l2 2h6.5A2.5 2.5 0 0 1 21 8.5v9A2.5 2.5 0 0 1 18.5 20h-13A2.5 2.5 0 0 1 3 17.5v-11Z"/></symbol>
36    <symbol id="icon-calculator" viewBox="0 0 24 24"><path d="M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm1 4v4h8V6H8Zm0 7v2h2v-2H8Zm4 0v2h2v-2h-2Zm4 
360v2h2v-2h-2Zm-8 4v2h2v-2H8Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Z"/></symbol>
37    <symbol id="icon-calendar" viewBox="0 0 24 24"><path d="M7 2h2v3h6V2h2v3h2a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2V2Zm12 8H5v9h14v-9Z"/></symbol>
38    <symbol id="icon-customers" viewBox="0 0 24 24"><path d="M8 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8Zm8.5 1a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7ZM2 20a6 6 0 0 1 12 0H2Zm11.5 0a7.5 7.5 0 0 0-1.2-4.1A5 5 0 0 1 22 18.5V20h-8.5Z"/></symbol>
39    <symbol id="icon-offers" viewBox="0 0 24 24"><path d="M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12h8v2H8v-2Zm0 4h8v2H8v-2Z"/></symbol>
40    <symbol id="icon-project-flow" viewBox="0 0 24 24"><path d="M5 4h14v2H5V4Zm2 4h2v3h6V8h2v3h2v6h-2v3h-2v-3H9v3H7v-3H5v-6h2V8Zm2 5v2h6v-2H9Z"/></symbol>
41    <symbol id="icon-email" viewBox="0 0 24 24"><path d="M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2Zm8 7.2L4.7 7H4v.7l8 5.7 8-5.7V7h-.7L12 12.2Z"/></symbol>
42    <symbol id="icon-company-card" viewBox="0 0 24 24"><path d="M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2Zm2 4v2h6V9H6Zm0 4v2h4v-2H6Zm9-3h3v2h-3v-2Zm-1 4h5v2h-5v-2Z"/></symbol>
43    <symbol id="icon-project-folders" viewBox="0 0 24 24"><path d="M3 6.5A2.5 2.5 0 0 1 5.5 4H10l2 2h6.5A2.5 2.5 0 0 1 21 8.5V10H3V6.5Zm0 5.5h18v5.5a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 17.5V12Zm5 2v2h8v-2H8Z"/></symbol>
44    <symbol id="icon-supplier-folders" viewBox="0 0 24 24"><path d="M4 5h6l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2Zm2 6v5h3v-5H6Zm5-2v7h3V9h-3Zm5 3v4h3v-4h-3Z"/></symbol>
45    <symbol id="icon-login" viewBox="0 0 24 24"><path d="M10 4h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-8v-2h8V6h-8V4Zm1.5 4.5L15 12l-3.5 3.5-1.4-1.4 1.1-1.1H3v-2h8.2l-1.1-1.1 1.4-1.4Z"/></symbol>
46    <symbol id="icon-logout" viewBox="0 0 24 24"><path d="M4 4h8v2H4v12h8v2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2Zm10.5 4.5L18 12l-3.5 3.5-1.4-1.4 1.1-1.1H7v-2h7.2l-1.1-1.1 1.4-1.4ZM18 6h2v12h-2V6Z"/></symbol>
47    <symbol id="icon-admin" viewBox="0 0 24 24"><path d="M12 2 4 5.5v6.2c0 5 3.4 9.6 8 10.8 4.6-1.2 8-5.8 8-10.8V5.5L12 2Zm0 5a2.5 2.5 0 0 1 1.3 4.6L15 17H9l1.7-5.4A2.5 2.5 0 0 1 12 7Z"/></symbol>
48    <symbol id="icon-total-offer" viewBox="0 0 24 24"><path d="M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12h8v2H8v-2Zm0 4h5v2H8v-2Z"/><path d="m16.5 15 .8 1.6 1.7.2-1.2 1.2.3 1.7-1.6-.8-1.5.8.3-1.7-1.2-1.2 1.7-.2.7-1.6Z"/></symbol>
49    <symbol id="icon-total-margin" viewBox="0 0 24 24"><path d="M7 3h10a4 4 0 0 1 4 4v10a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V7a4 4 0 0 1 4-4Zm0 2a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2H7Zm2 3h2v2H9V8Zm4 0h2v2h-2V8Zm-4 4h2v2H9v-2Zm4 0h2v2h-2v-2Zm-4 4h6v2H9v-2Z"/></symbol>
50    <symbol id="icon-total-profit" viewBox="0 0 24 24"><path d="M4 19h16v2H2V3h2v16Zm2-3 4-5 3 3 5-7 1.6 1.2-6.3 8.8-3-3-2.7 3.4L6 16Z"/><path d="M15 5h5v5h-2V7h-3V5Z"/></symbol>
51  </svg>
52  <header>
53    <div class="header-top">
54      <h1>Prosjektstyringsverkt&oslash;y</h1>
55    </div>
56    <div class="market-bar" id="marketTicker" aria-live="polite">
57      <div class="market-item">
58        <span class="market-label">LME aluminium</span>
59        <span class="market-value" id="marketAlPrice">--</span>
60        <span class="market-note" id="marketAlMeta">USD/t · ALI=F</span>
61      </div>
62      <div class="market-item">
63        <div class="market-fx-grid">
64          <span class="market-label">USD / NOK</span>
65          <span class="market-label">1 uke</span>
66          <span class="market-label">1 MND</span>
67          <span class="market-value" id="marketUsdNok">--</span>
68          <span class="market-change-value" id="marketUsdWeek"><span class="market-change-rate">--</span><span class="market-change-percent">--</span></span>
69          <span class="market-change-value" id="marketUsdMonth"><span class="market-change-rate">--</span><span class="market-change-percent">--</span></span>
70        </div>
71        <span class="market-note" id="marketUsdMeta">Henter...</span>
72      </div>
73      <div class="market-item">
74        <div class="market-fx-grid">
75          <span class="market-label">EUR / NOK</span>
76          <span class="market-label">1 uke</span>
77          <span class="market-label">1 MND</span>
78          <span class="market-value" id="marketEurNok">--</span>
79          <span class="market-change-value" id="marketEurWeek"><span class="market-change-rate">--</span><span class="market-change-percent">--</span></span>
80          <span class="market-change-value" id="marketEurMonth"><span class="market-change-rate">--</span><span class="market-change-percent">--</span></span>
81        </div>
82        <span class="market-note" id="marketEurMeta">Henter...</span>
83      </div>
84      <div class="market-item market-updated">
85        <span class="market-label">Sist oppdatert</span>
86        <span class="market-value small" id="marketUpdated">--</span>
87        <span class="market-status" id="marketStatus">Henter...</span>
88      </div>
89    </div>
90  </header>
91
92  <main class="app-shell" id="dashboardShell">
93    <aside class="dashboard-sidebar" aria-label="Hovedmeny">
94      <div class="sidebar-top-row">
95        <button type="button" class="sidebar-collapse-btn" id="dashboardSidebarToggle" aria-label="Minimer meny" aria-expanded="true">
96          <span class="sidebar-collapse-icon" aria-hidden="true"></span>
97        </button>
98        <a class="sidebar-brand" href="https://busbar.no" aria-label="G&aring; til busbar.no">
99          <div class="logo-mask" role="img" aria-label="Logo"></div>
100        </a>
101      </div>
102      <nav class="sidebar-nav">
103        <div class="sidebar-nav-section">
104          <button type="button" class="sidebar-nav-item is-active" data-dashboard-nav="dashboard"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-dashboard"></use></svg><span class="sidebar-nav-label">Dashbord</span></button>
105          <a class="sidebar-nav-item" href="calculator.html" data-dashboard-link="calculator"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-calculator"></use></svg><span class="sidebar-nav-label">Prisverkt&oslash;y</span></a>
106          <button type="button" class="sidebar-nav-item" data-dashboard-nav="projects"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-projects"></use></svg><span class="sidebar-nav-label">Prosjekter</span></button>
107          <button type="button" class="sidebar-nav-item" data-dashboard-nav="project-flow"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-project-flow"></use></svg><span class="sidebar-nav-label">Prosjektflyt</span></button>
108          <button type="button" class="sidebar-nav-item" data-dashboard-nav="offers"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-offers"></use></svg><span class="sidebar-nav-label">Tilbud</span></button>
109          <button type="button" class="sidebar-nav-item" data-dashboard-nav="email"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-email"></use></svg><span class="sidebar-nav-label">E-post</span></button>
110          <button type="button" class="sidebar-nav-item" data-dashboard-nav="calendar"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-calendar"></use></svg><span class="sidebar-nav-label">Kalender</span></button>
111          <button type="button" class="sidebar-nav-item" data-dashboard-nav="customers"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-customers"></use></svg><span class="sidebar-nav-label">Kontaktpersoner</span></button>
112          <button type="button" class="sidebar-nav-item" data-dashboard-nav="company-card"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-company-card"></use></svg><span class="sidebar-nav-label">
112Kundekort</span></button>
113          <div class="sidebar-separator" aria-hidden="true"></div>
114          <button type="button" class="sidebar-nav-item" data-dashboard-nav="busbar-folders"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-project-folders"></use></svg><span class="sidebar-nav-label">Busbar</span></button>
115          <button type="button" class="sidebar-nav-item" data-dashboard-nav="project-folders"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-project-folders"></use></svg><span class="sidebar-nav-label">Prosjektmapper</span></button>
116          <button type="button" class="sidebar-nav-item" data-dashboard-nav="supplier-folders"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-supplier-folders"></use></svg><span class="sidebar-nav-label">Leverand&oslash;rmapper</span></button>
117        </div>
118        <div class="sidebar-nav-section is-bottom">
119          <div class="sidebar-separator" aria-hidden="true"></div>
120          <div id="authControls" class="sidebar-auth-block">
121            <span id="authUser" class="auth-user muted-text" hidden></span>
122            <div class="sidebar-auth-actions">
123              <button id="loginBtn" class="btn sidebar-auth-btn" title="Logg p&aring;"><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-login"></use></svg><span class="sidebar-auth-label">Logg p&aring;</span></button>
124              <button id="logoutBtn" class="btn alt sidebar-auth-btn" title="Logg av" hidden><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-logout"></use></svg><span class="sidebar-auth-label">Logg av</span></button>
125            </div>
126          </div>
127          <a class="sidebar-nav-item" href="admin.html" id="dashboardAdminNav" data-dashboard-admin hidden><svg class="sidebar-nav-icon" aria-hidden="true"><use href="#icon-admin"></use></svg><span class="sidebar-nav-label">Admin</span></a>
128        </div>
129      </nav>
130    </aside>
131
132    <section class="dashboard-main">
133    <div class="view-toolbar" hidden>
134      <a class="btn alt nav-page-btn is-disabled" aria-disabled="true" tabindex="-1">&Aring;pne prisverkt&oslash;y</a>
135    </div>
136
137      <section id="mainDashboardView" class="dashboard-page placeholder-page is-active" data-dashboard-page="dashboard">
138        <div class="placeholder-header">
139          <h2>Dashbord</h2>
140          <p class="muted-text">N&oslash;kkeltall og snarveier fra programmet samlet p&aring; ett sted.</p>
141        </div>
142        <div class="main-dashboard-grid">
143          <article class="main-dashboard-widget dashboard-total-widget is-large">
144            <div class="dashboard-widget-header">
145              <div>
146                <h3>Totaler</h3>
147                <p class="muted-text">Summer fra alle beregnede linjer.</p>
148              </div>
149              <div class="dashboard-total-header-actions">
150                <span id="dashboardTotalsMeta" class="dashboard-total-header-meta"></span>
151                <div class="dashboard-total-filters" aria-label="Filtrer totaler">
152                <label class="dashboard-total-filter" for="dashboardTotalsYearFilter"><span class="dashboard-total-filter-label"><svg class="dashboard-total-filter-icon" aria-hidden="true"><use href="#icon-calendar"></use></svg>År</span>
153                  <select id="dashboardTotalsYearFilter">
154                    <option value="all">Alle</option>
155                  </select>
156                </label>
157                <label class="dashboard-total-filter" for="dashboardTotalsMonthFilter"><span class="dashboard-total-filter-label"><svg class="dashboard-total-filter-icon" aria-hidden="true"><use href="#icon-calendar"></use></svg>MÃ¥ned</span>
158                  <select id="dashboardTotalsMonthFilter">
159                    <option value="all">Alle</option>
160                  </select>
161                </label>
162                </div>
163                <button id="dashboardTotalsExport" class="btn" type="button">Eksporter rapport</button>
164              </div>
165            </div>
166            <div id="dashboardTotalsContent" class="dashboard-total-content"></div>
167          </article>
168          <article class="main-dashboard-widget dashboard-status-widget is-small">
169            <div class="dashboard-widget-header">
170              <div>
171                <h3>Prosjekter</h3>
172                <p class="muted-text">Antall prosjekter fordelt p&aring; status.</p>
173              </div>
174            </div>
175            <div id="dashboardProjectStatusSummary" class="dashboard-status-summary"></div>
176          </article>
177          <article class="main-dashboard-widget dashboard-flow-status-widget is-small">
178            <div class="dashboard-widget-header">
179              <div>
180                <h3>Prosjektflyt</h3>
181                <p class="muted-text">Antall prosjekter fordelt p&aring; flytstatus.</p>
182              </div>
183            </div>
184            <div id="dashboardFlowStatusSummary" class="dashboard-status-summary"></div>
185          </article>
186          <article class="main-dashboard-widget dashboard-todo-widget is-small">
187            <div class="dashboard-widget-header">
188              <div>
189                <h3>To-Do</h3>
190                <p class="muted-text">Oppgaver knyttet til prosjekter.</p>
191              </div>
192              <button id="dashboardNewTodoBtn" type="button" class="btn alt btn-small">Ny oppgave</button>
193            </div>
194            <div id="dashboardTodoList" class="dashboard-todo-list" aria-live="polite"></div>
195          </article>
196          <article class="main-dashboard-widget dashboard-actions-widget is-wide">
197            <div class="dashboard-widget-header">
198              <div>
199                <h3>
199Anbefalte handlinger</h3>
200                <p class="muted-text">Oppgaver som bør behandles fra prosjekter, prosjektflyt og e-post.</p>
201              </div>
202            </div>
203            <div id="dashboardRecommendedActions" class="dashboard-recommended-actions"></div>
204          </article>
205          <article class="main-dashboard-widget dashboard-email-project-widget is-wide">
206            <div class="dashboard-widget-header">
207              <div>
208                <h3>Prosjektforslag</h3>
209                <p class="muted-text">E-posttråder som kan opprettes som nye prosjekter.</p>
210              </div>
211            </div>
212            <div id="dashboardEmailProjectSuggestions" class="dashboard-email-project-suggestions"></div>
213          </article>
214          <article class="main-dashboard-widget is-tall"><span>Tomt vindu</span></article>
215          <article class="main-dashboard-widget is-small"><span>Tomt vindu</span></article>
216          <article class="main-dashboard-widget is-wide"><span>Tomt vindu</span></article>
217          <article class="main-dashboard-widget is-medium"><span>Tomt vindu</span></article>
218          <article class="main-dashboard-widget is-small"><span>Tomt vindu</span></article>
219          <article class="main-dashboard-widget dashboard-copilot-widget is-small">
220            <div class="dashboard-widget-header">
221              <div>
222                <h3>Copilot</h3>
223              </div>
224            </div>
225          </article>
226        </div>
227        <form id="dashboardTodoForm" class="graph-edit-form dashboard-todo-edit-form" hidden autocomplete="off">
228          <label for="dashboardTodoProject">Prosjekt
229            <select id="dashboardTodoProject" required>
230              <option value="">Velg prosjekt</option>
231            </select>
232          </label>
233          <label class="calendar-date-field" for="dashboardTodoDate">Dato
234            <span class="calendar-date-input-row">
235              <input id="dashboardTodoDate" type="text" inputmode="numeric" autocomplete="off" placeholder="DD/MM/ÅÅÅÅ" required>
236              <button id="dashboardTodoDatePickerBtn" type="button" class="calendar-date-picker-btn" aria-label="Velg dato">
237                <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M7 2h2v3h6V2h2v3h2a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2V2Zm12 8H5v9h14v-9Z"/></svg>
238              </button>
239              <div id="dashboardTodoDatePickerPopover" class="calendar-date-picker-popover" hidden></div>
240            </span>
241          </label>
242          <label for="dashboardTodoStartTime">Starttid
243            <select id="dashboardTodoStartTime" required></select>
244          </label>
245          <label for="dashboardTodoDuration">Varighet
246            <select id="dashboardTodoDuration" required></select>
247          </label>
248          <label class="graph-wide-field" for="dashboardTodoText">Oppgavetekst
249            <input id="dashboardTodoText" type="text" required>
250          </label>
251          <div class="graph-edit-actions">
252            <button type="submit" class="btn">Lagre</button>
253            <button id="dashboardTodoCancelBtn" type="button" class="btn alt">Avbryt</button>
254          </div>
255        </form>
256      </section>
257
258    <section id="dashboardView" class="dashboard-page" data-dashboard-page="projects" hidden>
259      <div class="dashboard-header">
260        <div class="dashboard-intro">
261          <h2>Prosjekter</h2>
262          <p class="muted-text">Velg et prosjekt, eller opprett nytt prosjekt. Prisverkt&oslash;y &aring;pnes p&aring; egen side.</p>
263        </div>
264        <div class="dashboard-actions section-toolbar">
265          <button id="newProjectBtn" type="button" class="btn alt">Nytt prosjekt</button>
266          <div class="dashboard-sort-row">
267            <div class="dashboard-sort-controls dashboard-search-controls">
268              <label for="projectSearchInput">S&oslash;k prosjekt</label>
269              <input id="projectSearchInput" type="search" autocomplete="off" placeholder="Prosjekt, kunde, kontakt eller ansvarlig">
270            </div>
271            <div class="dashboard-sort-controls">
272              <label for="projectSortSelect">Sorter prosjekter</label>
273              <select id="projectSortSelect">
274                <option value="date_newest">Nyest f&oslash;rst</option>
275                <option value="date_oldest">Eldst f&oslash;rst</option>
276                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
277                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
278              </select>
279            </div>
280            <div class="dashboard-sort-controls">
281              <label for="lineSortSelect">Sorter linjer</label>
282              <select id="lineSortSelect">
283                <option value="date_newest">Nyest f&oslash;rst</option>
284                <option value="date_oldest">Eldst f&oslash;rst</option>
285                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
286                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
287              </select>
288            </div>
289            <button id="projectArchiveToggleBtn" type="button" class="btn alt project-archive-toggle-btn" aria-pressed="false">Prosjekt arkiv</button>
290          </div>
291          <div class="toolbar-right">
292            <span id="projectsStatus" class="graph-status muted-text"></span>
293            <button id="refreshProjectsBtn" type="button" class="btn alt">Oppdater</button>
294          </div>
295        </div>
296      </div>
297      <div id="projectList" class="project-list" aria-live="polite">
298        <div class="empty-state">
299          <p>Ingen prosjekter er registrert enn&aring;.</p>
300          <button id="newProjectEmptyBtn" type="button" class="btn alt" data-action="create-project">Nytt prosjekt</button>
301        </div>
302      </div>
303    </section>
304      <section id="projectFlowView" class="dashboard-page placeholder-page" data-dashboard-page="project-flow" hidden>
305        <div class="placeholder-header">
306          <h2>Prosjektflyt</h2>
307          <p class="muted-text">Visualiserer prosjektoppgaver som en Gantt-plan med start, slutt og fullf&oslash;rt-status.</p>
308        </div>
309        <div class="project-flow-toolbar section-toolbar">
310          <div class="toolbar-left">
311            <div class="dashboard-sort-controls">
312              <label for="projectFlowProjectSelect">Prosjekt</label>
313              <select id="projectFlowProjectSelect"></select>
314            </div>
315            <button id="addProjectFlowMilestoneBtn" type="button" class="btn alt">Ny oppgave</button>
316            <button id="projectFlowExpandAllBtn" type="button" class="btn alt">Utvid alle</button>
317            <button id="projectFlowZoomOutBtn" type="button" class="btn alt">Zoom ut</button>
318            <button id="projectFlowZoomInBtn" type="button" class="btn alt">Zoom inn</button>
319            <button id="projectFlowZoomFitBtn" type="button" class="btn alt">Tilpass visning</button>
320          </div>
321          <div class="toolbar-right">
322            <span id="projectFlowStatus" class="graph-status muted-text"></span>
323            <button id="refreshProjectFlowBtn" type="button" class="btn alt">Oppdater</button>
324          </div>
325        </div>
326        <form id="projectFlowMilestoneForm" class="project-flow-form" hidden>
327          <input id="projectFlowMilestoneId" type="hidden">
328          <input id="projectFlowClickedDateInput" type="hidden">
329          <label for="projectFlowTaskProjectSelect">Prosjekt
330            <select id="projectFlowTaskProjectSelect" required></select>
331          </label>
332          <label for="projectFlowDateInput">Startdato
333            <span class="calendar-date-input-row">
334              <input id="projectFlowDateInput" type="text" inputmode="numeric" autocomplete="off" placeholder="DD/MM/ÅÅÅÅ" required>
335              <button id="projectFlowStartDatePickerBtn" type="button" class="calendar-date-picker-btn" aria-label="Velg startdato">
336                <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M7 2h2v3h6V2h2v3h2a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2V2Zm12 8H5v9h14v-9Z"/></svg>
337              </button>
338              <div id="projectFlowDatePickerPopover" class="calendar-date-picker-popover" hidden></div>
339            </span>
340          </label>
341          <label for="projectFlowEndDateInput">Sluttdato
342            <span class="calendar-date-input-row">
343              <input id="projectFlowEndDateInput" type="text" inputmode="numeric" autocomplete="off" placeholder="DD/MM/ÅÅÅÅ" required>
344              <button id="projectFlowEndDatePickerBtn" type="button" class="calendar-date-picker-btn" aria-label="Velg sluttdato">
345                <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M7 2h2v3h6V2h2v3h2a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2V2Zm12 8H5v9h14v-9Z"/></svg>
346              </button>
347            </span>
348          </label>
349          <label for="projectFlowPhaseSelect">Oppgave
350            <select id="projectFlowPhaseSelect" required></select>
351          </label>
352          <label for="projectFlowDurationValueInput">Varighet
353            <input id="projectFlowDurationValueInput" type="number" min="1" step="1" value="1">
354          </label>
355          <label for="projectFlowDurationUnitSelect">Enhet
356            <select id="projectFlowDurationUnitSelect">
357              <option value="days">Dager</option>
358              <option value="weeks">Uker</option>
359              <option value="months">MÃ¥neder</option>
360            </select>
361          </label>
362          <label for="projectFlowFileInput">Fil
363            <input id="projectFlowFileInput" type="file" disabled title="Filopplasting i prosjektflyt er ikke aktivert enda">
364          </label>
365          <label for="projectFlowDependencyRelationSelect">Styrt av
366            <select id="projectFlowDependencyRelationSelect"></select>
367          </label>
368          <label for="projectFlowDependencyTaskSelect">Styrer
369            <select id="projectFlowDependencyTaskSelect"></select>
370          </label>
371          <label for="projectFlowTaskResponsibleInput">Ansvarlig
372            <input id="projectFlowTaskResponsibleInput" type="text" readonly>
373          </label>
374          <div class="graph-edit-actions">
375            <button type="submit" class="btn">Lagre</button>
376            <button id="deleteProjectFlowMilestoneBtn" type="button" class="btn danger" hidden>Slett</button>
377            <button id="cancelProjectFlowMilestoneBtn" type="button" class="btn alt">Avbryt</button>
378          </div>
379        </form>
380        <div id="projectFlowTimeline" class="project-flow-timeline" aria-live="polite"></div>
381      </section>
382      <section id="projectFlowBetaView" class="dashboard-page placeholder-page" data-dashboard-page="project-flow-beta" hidden>
383        <div class="placeholder-header">
384          <h2>Prosjektflyt-Beta</h2>
385          <p class="muted-text">Nytt utkast til prosjektflyt med struktur inspirert av arbeidsflytverkt&oslash;y som Asana og ClickUp.</p>
386        </div>
387        <div class="project-flow-beta-shell">
388          <div class="project-flow-toolbar project-flow-beta-toolbar section-toolbar">
389            <div class="toolbar-left">
390              <div class="dashboard-sort-controls">
391                <label for="projectFlowBetaProjectSelect">Prosjekt</label>
392                <select id="projectFlowBetaProjectSelect"></select>
393              </div>
394            </div>
395          </div>
396          <div class="project-flow-beta-tabs" role="tablist" aria-label="Prosjektflyt beta visning">
397            <button id="projectFlowBetaListTab" type="button" class="project-flow-beta-tab is-active" data-project-flow-beta-view="list" role="tab" aria-selected="true">Liste</button>
398            <button id="projectFlowBetaTimelineTab" type="button" class="project-flow-beta-tab" data-project-flow-beta-view="timeline" role="tab" aria-selected="false">Fremdriftsplan</button>
399          </div>
400          <div id="projectFlowBetaListPanel" class="project-flow-beta-table-wrap" data-project-flow-beta-panel="list" aria-label="Prosjektflyt beta liste">
401            <table class="project-flow-beta-table">
402              <colgroup>
403                <col class="project-flow-beta-col-task">
404                <col class="project-flow-beta-col-comment">
405                <col class="project-flow-beta-col-due">
406                <col class="project-flow-beta-col-assignee">
407                <col class="project-flow-beta-col-phase">
408                <col class="project-flow-beta-col-priority">
409                <col class="project-flow-beta-col-blocking">
410              </colgroup>
411              <thead>
412                <tr class="project-flow-beta-list-top-row" aria-hidden="true">
413                  <th colspan="7"></th>
414                </tr>
415                <tr>
416                  <th>Oppgaver</th>
417                  <th>Kommentar</th>
418                  <th>Tidsfrist</th>
419                  <th>Ansvarlig</th>
420                  <th>Prosjektfaser</th>
421                  <th>Prioritet</th>
422                  <th>Blokkerer</th>
423                </tr>
424              </thead>
425              <tbody id="projectFlowBetaTableBody">
426                <tr class="project-flow-beta-phase-row">
427                  <td colspan="7"><span class="project-flow-beta-caret">▾</span><strong>1.00.0 Str&oslash;mskinner - Salg</strong></td>
428                </tr>
429                <tr>
430                  <td><span class="project-flow-beta-status is-done"></span>1.01.0 Foresp&oslash;rsel</td>
431                  <td></td>
432                  <td><span class="project-flow-beta-date-icon"></span></td>
433                  <td><span class="project-flow-beta-assignee-icon"></span></td>
434                  <td><span class="project-flow-beta-tag is-sales">Salg</span></td>
435                  <td><span class="project-flow-beta-priority is-high">H&oslash;y</span></td>
436                  <td><span class="project-flow-beta-blocker"><span class="project-flow-beta-blocker-lock" aria-hidden="true"></span>1.03.0 Bestilling &middot; FS</span></td>
437                </tr>
438                <tr>
439                  <td><span class="project-flow-beta-status is-done"></span>1.02.0 Tilbud</td>
440                  <td></td>
441                  <td><span class="project-flow-beta-date-icon"></span></td>
442                  <td><span class="project-flow-beta-assignee-icon"></span></td>
443                  <td><span class="project-flow-beta-tag is-sales">Salg</span></td>
444                  <td><span class="project-flow-beta-priority is-medium">Middels</span></td>
445                  <td><span class="project-flow-beta-blocker"><span class="project-flow-beta-blocker-lock" aria-hidden="true"></span>1.03.0 Bestilling &middot; FS</span></td>
446                </tr>
447                <tr>
448                  <td><span class="project-flow-beta-status is-waiting"></span>1.03.0 Bestilling</td>
449                  <td></td>
450                  <td><span class="project-flow-beta-date-icon"></span></td>
451                  <td><span class="project-flow-beta-assignee-icon"></span></td>
452                  <td><span class="project-flow-beta-tag is-sales">Salg</span></td>
453                  <td></td>
454                  <td></td>
455                </tr>
456                <tr>
457                  <td><span class="project-flow-beta-status is-waiting"></span>1.04.0 Fakturert</td>
458                  <td></td>
459                  <td><span class="project-flow-beta-date-icon"></span></td>
460                  <td><span class="project-flow-beta-assignee-icon"></span></td>
461                  <td><span class="project-flow-beta-tag is-sales">Salg</span></td>
462                  <td></td>
463                  <td></td>
464                </tr>
465                <tr class="project-flow-beta-phase-row">
466                  <td colspan="7"><span class="project-flow-beta-caret">▾</span><strong>2.00.0 Str&oslash;mskinner - Prosjektering</strong></td>
467                </tr>
468                <tr>
469                  <td><span class="project-flow-beta-status is-approval"></span>2.01.0 Oppdatere Dynamics/solgt</td>
470                  <td></td>
471                  <td><span class="project-flow-beta-date-icon"></span></td>
472                  <td><span class="project-flow-beta-assignee-icon"></span></td>
473                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
474                  <td></td>
475                </tr>
476                <tr>
477                  <td><span class="project-flow-beta-caret">▾</span><span class="project-flow-beta-status is-waiting"></span>
4772.02.0 Leveringsomfang <span class="project-flow-beta-subtask-count">6</span></td>
478                  <td></td>
479                  <td><span class="project-flow-beta-date-icon"></span></td>
480                  <td><span class="project-flow-beta-assignee-icon"></span></td>
481                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
482                  <td></td>
483                </tr>
484                <tr class="project-flow-beta-subtask-row">
485                  <td><span class="project-flow-beta-status is-approval"></span>2.02.1 Fleksibler</td>
486                  <td></td>
487                  <td><span class="project-flow-beta-date-icon"></span></td>
488                  <td><span class="project-flow-beta-assignee-icon"></span></td>
489                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
490                  <td></td>
491                </tr>
492                <tr class="project-flow-beta-subtask-row">
493                  <td><span class="project-flow-beta-status is-approval"></span>2.02.2 branngjennomf&oslash;ringer</td>
494                  <td></td>
495                  <td><span class="project-flow-beta-date-icon"></span></td>
496                  <td><span class="project-flow-beta-assignee-icon"></span></td>
497                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
498                  <td><span class="project-flow-beta-priority is-low">Lav</span></td>
499                </tr>
500                <tr class="project-flow-beta-subtask-row">
501                  <td><span class="project-flow-beta-status is-approval"></span>2.02.3 Utsparinger</td>
502                  <td></td>
503                  <td><span class="project-flow-beta-date-icon"></span></td>
504                  <td><span class="project-flow-beta-assignee-icon"></span></td>
505                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
506                  <td></td>
507                </tr>
508                <tr class="project-flow-beta-subtask-row">
509                  <td><span class="project-flow-beta-status is-approval"></span>2.02.4 Detaljtegninger rom</td>
510                  <td></td>
511                  <td><span class="project-flow-beta-date-icon"></span></td>
512                  <td><span class="project-flow-beta-assignee-icon"></span></td>
513                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
514                  <td></td>
515                </tr>
516                <tr class="project-flow-beta-subtask-row">
517                  <td><span class="project-flow-beta-status is-approval"></span>2.02.5 Detaljtegninger trafo</td>
518                  <td></td>
519                  <td><span class="project-flow-beta-date-icon"></span></td>
520                  <td><span class="project-flow-beta-assignee-icon"></span></td>
521                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
522                  <td></td>
523                </tr>
524                <tr class="project-flow-beta-subtask-row">
525                  <td><span class="project-flow-beta-status is-approval"></span>2.02.6 Detaljtegninger tavle</td>
526                  <td></td>
527                  <td><span class="project-flow-beta-date-icon"></span></td>
528                  <td><span class="project-flow-beta-assignee-icon"></span></td>
529                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
530                  <td></td>
531                </tr>
532                <tr>
533                  <td><span class="project-flow-beta-status is-approval"></span>2.03.0 Befaring/Teams-m&oslash;te</td>
534                  <td></td>
535                  <td><span class="project-flow-beta-date-icon"></span></td>
536                  <td><span class="project-flow-beta-assignee-icon"></span></td>
537                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
538                  <td></td>
539                </tr>
540                <tr>
541                  <td><span class="project-flow-beta-status is-waiting"></span>2.04.0 Prosjektere/Tegne</td>
542                  <td></td>
543                  <td><span class="project-flow-beta-date-icon"></span></td>
544                  <td><span class="project-flow-beta-assignee-icon"></span></td>
545                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
546                  <td></td>
547                </tr>
548                <tr>
549                  <td><span class="project-flow-beta-status is-waiting"></span>2.05.0 Sende tegninger til kunde</td>
550                  <td></td>
551                  <td><span class="project-flow-beta-date-icon"></span></td>
552                  <td><span class="project-flow-beta-assignee-icon"></span></td>
553                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
554                  <td></td>
555                </tr>
556                <tr>
557                  <td><span class="project-flow-beta-status is-waiting"></span>2.06.0 Godkjente tegninger fra kunde/design freeze</td>
558                  <td></td>
559                  <td><span class="project-flow-beta-date-icon"></span></td>
560                  <td><span class="project-flow-beta-assignee-icon"></span></td>
561                  <td><span class="project-flow-beta-tag is-engineering">Prosjektering</span></td>
562                  <td></td>
563                </tr>
564              </tbody>
565            </table>
566          </div>
567          <div id="projectFlowBetaTimelinePanel" class="project-flow-beta-timeline-wrap" data-project-flow-beta-panel="timeline" aria-label="Prosjektflyt beta fremdriftsplan" hidden>
568            <div id="projectFlowBetaTimeline" class="project-flow-beta-timeline" aria-live="polite"></div>
569          </div>
570        </div>
571      </section>
572      <section id="calendarView" class="dashboard-page placeholder-page" data-dashboard-page="calendar" hidden>
573        <div class="placeholder-header">
574          <h2>Kalender</h2>
575          <p class="muted-text">Viser kommende kalenderhendelser fra Microsoft-kontoen din.</p>
576        </div>
577        <div class="graph-toolbar section-toolbar">
578          <div class="toolbar-left">
579            <button id="newCalendarEventBtn" type="button" class="btn alt">Ny avtale</button>
580            <div class="calendar-period-controls">
581              <button id="calendarTodayBtn" type="button" class="calendar-today-btn">I dag</button>
582              <button id="calendarPrevBtn" type="button" class="calendar-period-btn" aria-label="Forrige periode"><span class="calendar-period-icon">&lsaquo;</span></button>
583              <button id="calendarNextBtn" type="button" class="calendar-period-btn" aria-label="Neste periode"><span class="calendar-period-icon">&rsaquo;</span></button>
584              <span id="calendarPeriodLabel" class="calendar-period-label"></span>
585            </div>
586            <label class="calendar-mode-select-label" for="calendarModeSelect">
587              <select id="calendarModeSelect" class="calendar-mode-select">
588                <option value="month">M&aring;ned</option>
589                <option value="week">Uke</option>
590                <option value="list">Liste</option>
591              </select>
592            </label>
593          </div>
594          <div class="toolbar-right">
595            <span id="calendarStatus" class="graph-status muted-text"></span>
596            <button id="refreshCalendarBtn" type="button" class="btn alt">Oppdater</button>
597          </div>
598        </div>
599        <form id="calendarEventForm" class="graph-edit-form" hidden>
600          <input id="calendarEventId" type="hidden">
601          <div class="calendar-attendees-field">
602            <label for="calendarAttendeeInput">E-post</label>
603            <div class="calendar-attendee-input-row">
604              <input id="calendarAttendeeInput" type="text" inputmode="email" list="calendarAttendeeOptions" autocomplete="email" placeholder="Velg eller skriv e-post">
605              <button id="addCalendarAttendeeBtn" type="button" class="btn alt">Legg til</button>
606            </div>
607            <datalist id="calendarAttendeeOptions"></datalist>
608            <div id="calendarAttendeesList" class="calendar-attendees-list" aria-live="polite"></div>
609          </div>
610          <label for="calendarEventSubject">Emne
611            <input id="calendarEventSubject" type="text" required>
612          </label>
613          <label class="calendar-project-field" for="calendarEventProject">Prosjekt
614            <select id="calendarEventProject">
615              <option value="">Ingen prosjektkobling</option>
616            </select>
617          </label>
618          <label class="calendar-type-field" for="calendarEventType">Avtale type
619            <select id="calendarEventType">
620              <option value="">Åpen</option>
621              <option value="calendar">Kalender</option>
622              <option value="project-flow">Prosjektflyt oppgave</option>
623              <option value="todo">To-Do oppgave</option>
624            </select>
625          </label>
626          <label class="calendar-date-field" for="calendarEventStartDate">Startdato
627            <span class="calendar-date-input-row">
628              <input id="calendarEventStartDate" type="text" inputmode="numeric" autocomplete="off" placeholder="DD/MM/ÅÅÅÅ" required>
629              <button id="calendarEventDatePickerBtn" type="button" class="calendar-date-picker-btn" aria-label="Velg dato">
630                <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M7 2h2v3h6V2h2v3h2a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2V2Zm12 8H5v9h14v-9Z"/></svg>
631              </button>
632              <input id="calendarEventDatePicker" class="calendar-hidden-date-picker" type="date" tabindex="-1" aria-hidden="true">
633              <div id="calendarDatePickerPopover" class="calendar-date-picker-popover" hidden></div>
634            </span>
635          </label>
636          <label class="calendar-compact-field" for="calendarEventStartTime">Starttid
637            <select id="calendarEventStartTime" required></select>
638          </label>
639          <label class="calendar-compact-field" for="calendarEventDuration">Varighet
640            <select id="calendarEventDuration" required></select>
641          </label>
642          <label for="calendarEventLocation">Sted
643            <input id="calendarEventLocation" type="text">
644          </label>
645          <label class="graph-wide-field" for="calendarEventBody">Notat
646            <textarea id="calendarEventBody" rows="4"></textarea>
647          </label>
648          <div class="graph-edit-actions">
649            <button type="submit" class="btn">Lagre</button>
650            <button id="cancelCalendarEventBtn" type="button" class="btn alt">Avbryt</button>
651            <button id="deleteCalendarEventBtn" type="button" class="btn danger" hidden>Slett</button>
652          </div>
653        </form>
654        <div id="calendarEventsList" class="graph-list calendar-events-list" aria-live="polite"></div>
655        <div id="calendarGridView" class="calendar-grid-view" aria-live="polite" hidden></div>
656      </section>
657
658      <section id="offersView" class="dashboard-page placeholder-page" data-dashboard-page="offers" hidden>
659        <div class="placeholder-header">
660          <h2>Tilbud</h2>
661          <p class="muted-text">Siste registrerte tilbudsrevisjon per prosjekt.</p>
662        </div>
663        <div class="dashboard-sort-row offers-sort-row section-toolbar">
664          <div class="dashboard-sort-controls dashboard-search-controls">
665            <label for="offerSearchInput">S&oslash;k tilbud</label>
666            <input id="offerSearchInput" type="search" autocomplete="off" placeholder="Prosjekt, kunde, ansvarlig eller tilbudsnummer">
667          </div>
668          <div class="dashboard-sort-controls">
669            <label for="offerSortSelect">Sorter tilbud</label>
670            <select id="offerSortSelect">
671              <option value="date_newest">Nyest f&oslash;rst</option>
672              <option value="date_oldest">Eldst f&oslash;rst</option>
673              <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
674              <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
675            </select>
676          </div>
677          <div class="toolbar-right">
678            <span id="offersStatus" class="graph-status muted-text"></span>
679            <button id="refreshOffersBtn" type="button" class="btn alt">Oppdater</button>
680          </div>
681        </div>
682        <div id="offersList" class="offers-list" aria-live="polite"></div>
683      </section>
684
685      <section id="emailView" class="dashboard-page placeholder-page" data-dashboard-page="email" hidden>
686        <div class="placeholder-header">
687          <h2>E-post</h2>
688          <p class="muted-text">Viser innboksen til [email protected] for Owners.</p>
689        </div>
690        <div class="graph-toolbar section-toolbar">
691          <div class="toolbar-left">
692            <button id="composeEmailBtn" type="button" class="btn alt">Ny e-post</button>
693          </div>
694          <div class="toolbar-right">
695            <span id="emailStatus" class="graph-status muted-text"></span>
696            <button id="refreshEmailBtn" type="button" class="btn alt">Oppdater</button>
697          </div>
698        </div>
699        <form id="emailComposeForm" class="graph-edit-form" hidden>
700          <label for="emailToInput">Til
701            <input id="emailToInput" type="text" inputmode="email" placeholder="[email protected]" required>
702          </label>
703          <label for="emailCcInput">Kopi
704            <input id="emailCcInput" type="text" inputmode="email" placeholder="valgfritt">
705          </label>
706          <label for="emailSubjectInput">Emne
707            <input id="emailSubjectInput" type="text" required>
708          </label>
709          <label class="graph-wide-field" for="emailBodyInput">Melding
710            <textarea id="emailBodyInput" rows="7" required></textarea>
711          </label>
712          <div class="graph-edit-actions">
713            <button type="submit" class="btn">Send</button>
714            <button id="cancelEmailComposeBtn" type="button" class="btn alt">Avbryt</button>
715          </div>
716        </form>
717        <div id="emailMessagesList" class="graph-list email-messages-list" aria-live="polite"></div>
718      </section>
719
720      <section id="customersView" class="dashboard-page placeholder-page" data-dashboard-page="customers" hidden>
721        <div class="placeholder-header">
722          <h2>Kontaktpersoner</h2>
723          <p class="muted-text">Global liste med kontaktpersoner registrert p&aring; firma i prosjektene.</p>
724        </div>
725        <div class="global-data-toolbar section-toolbar">
726          <div class="toolbar-left">
727            <button id="addContactBtn" type="button" class="btn alt">Legg til kontakt</button>
728            <div class="dashboard-sort-controls dashboard-search-controls">
729              <label for="contactSearchInput">S&oslash;k kontaktpersoner</label>
730              <input id="contactSearchInput" type="search" autocomplete="off" placeholder="Kontaktperson, firma eller telefon">
731            </div>
732            <div class="dashboard-sort-controls">
733              <label for="contactSortSelect">Sorter kontaktpersoner</label>
734              <select id="contactSortSelect">
735                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
736                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
737                <option value="date_newest">Nyest f&oslash;rst</option>
738                <option value="date_oldest">Eldst f&oslash;rst</option>
739              </select>
740            </div>
741          </div>
742          <div class="toolbar-right">
743            <span id="contactsStatus" class="graph-status muted-text"></span>
744            <button id="refreshContactsBtn" type="button" class="btn alt">Oppdater</button>
745          </div>
746          <span id="contactsOwnerHint" class="global-owner-hint muted-text">Kun Entra Owners kan redigere.</span>
747        </div>
748        <form id="contactEditForm" class="global-edit-form" data-editing="0" hidden>
749          <input id="contactOriginalCustomer" type="hidden">
750          <input id="contactOriginalName" type="hidden">
751          <div class="global-edit-actions">
752            <button type="submit" class="btn">Lagre</button>
753            <button id="cancelContactEditBtn" type="button" class="btn alt">Avbryt</button>
754          </div>
755          <label for="contactCompanyInput">Firmanavn
756            <input id="contactCompanyInput" type="text" list="globalCompanyOptions" required>
757          </label>
758          <label for="contactNameInput">Kontaktperson
759            <input id="contactNameInput" type="text" required>
760          </label>
761          <label for="contactPhoneInput">Telefon
762            <input id="contactPhoneInput" type="text" inputmode="tel">
763          </label>
764          <label for="contactEmailInput">E-post
765            <input id="contactEmailInput" type="email" autocomplete="email">
766          </label>
767        </form>
768        <div id="contactsList" class="global-data-list" aria-live="polite"></div>
769      </section>
770
771      <section id="companyCardView" class="dashboard-page placeholder-page" data-dashboard-page="company-card" hidden>
772        <div class="placeholder-header">
773          <h2>Kundekort</h2>
774          <p class="muted-text">Global liste med firma som er registrert p&aring; prosjekter.</p>
775        </div>
776        <div class="global-data-toolbar section-toolbar">
777          <div class="toolbar-left">
778            <button id="addCompanyBtn" type="button" class="btn alt">Legg til kunde</button>
779            <div class="dashboard-sort-controls dashboard-search-controls">
780              <label for="companySearchInput">S&oslash;k kunde</label>
781              <input id="companySearchInput" type="search" autocomplete="off" placeholder="Kunde, adresse eller segment">
782            </div>
783            <div class="dashboard-sort-controls">
784              <label for="companySortSelect">Sorter kunde</label>
785              <select id="companySortSelect">
786                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
787                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
788                <option value="date_newest">Nyest f&oslash;rst</option>
789                <option value="date_oldest">Eldst f&oslash;rst</option>
790              </select>
791            </div>
792          </div>
793          <div class="toolbar-right">
794            <span id="companiesStatus" class="graph-status muted-text"></span>
795            <button id="refreshCompaniesBtn" type="button" class="btn alt">Oppdater</button>
796          </div>
797          <span id="companiesOwnerHint" class="global-owner-hint muted-text">Kun Entra Owners kan redigere.</span>
798        </div>
799        <form id="companyEditForm" class="global-edit-form" data-editing="0" hidden>
800          <input id="companyOriginalName" type="hidden">
801          <div class="global-edit-actions">
802            <button type="submit" class="btn">Lagre</button>
803            <button id="cancelCompanyEditBtn" type="button" class="btn alt">Avbryt</button>
804          </div>
805          <label for="companyNameInput">Firmanavn
806            <input id="companyNameInput" type="text" required>
807          </label>
808          <label for="companyAddressInput">Adresse
809            <input id="companyAddressInput" type="text">
810          </label>
811          <label for="companyPostalPlaceInput">Postnummer og sted
812            <input id="companyPostalPlaceInput" type="text">
813          </label>
814          <label for="companySegmentInput">Kundesegment
815            <input id="companySegmentInput" type="text">
816          </label>
817          <label for="companyResponsibleInput">Kundeansvarlig
818            <input id="companyResponsibleInput" type="text">
819          </label>
820        </form>
821        <datalist id="globalCompanyOptions"></datalist>
822        <div id="companiesList" class="global-data-list" aria-live="polite"></div>
823      </section>
824
825      <section id="busbarFoldersView" class="dashboard-page placeholder-page" data-dashboard-page="busbar-folders" hidden>
826        <div class="placeholder-header">
827          <h2>Busbar</h2>
828          <p class="muted-text">Viser innhold fra SharePoint-mappen Drift/BUSBAR.</p>
829        </div>
830        <div class="graph-toolbar section-toolbar">
831          <div class="toolbar-left">
832            <button id="newBusbarFolderBtn" type="button" class="btn alt">Ny mappe</button>
833            <label class="btn alt graph-file-upload-label" for="uploadBusbarFolderFile">Legg til fil</label>
834            <input id="uploadBusbarFolderFile" type="file" hidden>
835            <div class="dashboard-sort-controls dashboard-search-controls">
836              <label for="busbarFolderSearchInput">S&oslash;k mappe</label>
837              <input id="busbarFolderSearchInput" type="search" autocomplete="off" placeholder="Mappe eller filnavn">
838            </div>
839            <div class="dashboard-sort-controls">
840              <label for="busbarFolderSortSelect">Sorter mapper</label>
841              <select id="busbarFolderSortSelect">
842                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
843                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
844                <option value="date_newest">Nyest f&oslash;rst</option>
845                <option value="date_oldest">Eldst f&oslash;rst</option>
846              </select>
847            </div>
848          </div>
849          <div class="toolbar-right">
850            <span id="busbarFoldersStatus" class="graph-status muted-text"></span>
851            <button id="refreshBusbarFoldersBtn" type="button" class="btn alt">Oppdater</button>
852          </div>
853        </div>
854        <div id="busbarFoldersList" class="sharepoint-list" aria-live="polite"></div>
855      </section>
856
857      <section id="projectFoldersView" class="dashboard-page placeholder-page" data-dashboard-page="project-folders" hidden>
858        <div class="placeholder-header">
859          <h2>Prosjektmapper</h2>
860          <p class="muted-text">Viser innhold fra SharePoint-mappen Drift/BUSBAR/Prosjekter/2026.</p>
861        </div>
862        <div class="graph-toolbar section-toolbar">
863          <div class="toolbar-left">
864            <button id="newProjectFolderBtn" type="button" class="btn alt">Ny mappe</button>
865            <label class="btn alt graph-file-upload-label" for="uploadProjectFolderFile">Legg til fil</label>
866            <input id="uploadProjectFolderFile" type="file" hidden>
867            <div class="dashboard-sort-controls dashboard-search-controls">
868              <label for="projectFolderSearchInput">S&oslash;k mappe</label>
869              <input id="projectFolderSearchInput" type="search" autocomplete="off" placeholder="Mappe eller filnavn">
870            </div>
871            <div class="dashboard-sort-controls">
872              <label for="projectFolderSortSelect">Sorter mapper</label>
873              <select id="projectFolderSortSelect">
874                <option value="alpha_asc">Alfabetisk (A-&Aring;)</option>
875                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
876                <option value="date_newest">Nyest f&oslash;rst</option>
877                <option value="date_oldest">Eldst f&oslash;rst</option>
878              </select>
879            </div>
880          </div>
881          <div class="toolbar-right">
882            <span id="projectFoldersStatus" class="graph-status muted-text"></span>
883            <button id="refreshProjectFoldersBtn" type="button" class="btn alt">Oppdater</button>
884          </div>
885        </div>
886        <div id="projectFoldersList" class="sharepoint-list" aria-live="polite"></div>
887      </section>
888
889      <section id="supplierFoldersView" class="dashboard-page placeholder-page" data-dashboard-page="supplier-folders" hidden>
890        <div class="placeholder-header">
891          <h2>Leverand&oslash;rmapper</h2>
892          <p class="muted-text">Viser innhold fra SharePoint-mappen Drift/BUSBAR/Str&oslash;mskinner.</p>
893        </div>
894        <div class="graph-toolbar section-toolbar">
895          <div class="toolbar-left">
896            <button id="newSupplierFolderBtn" type="button" class="btn alt">Ny mappe</button>
897            <label class="btn alt graph-file-upload-label" for="uploadSupplierFolderFile">Legg til fil</label>
898            <input id="uploadSupplierFolderFile" type="file" hidden>
899            <div class="dashboard-sort-controls dashboard-search-controls">
900              <label for="supplierFolderSearchInput">S&oslash;k mappe</label>
901              <input id="supplierFolderSearchInput" type="search" autocomplete="off" placeholder="Mappe eller filnavn">
902            </div>
903            <div class="dashboard-sort-controls">
904              <label for="supplierFolderSortSelect">Sorter mapper</label>
905              <select id="supplierFolderSortSelect">
906                <option value="alpha_asc">
906Alfabetisk (A-&Aring;)</option>
907                <option value="alpha_desc">Alfabetisk (&Aring;-A)</option>
908                <option value="date_newest">Nyest f&oslash;rst</option>
909                <option value="date_oldest">Eldst f&oslash;rst</option>
910              </select>
911            </div>
912          </div>
913          <div class="toolbar-right">
914            <span id="supplierFoldersStatus" class="graph-status muted-text"></span>
915            <button id="refreshSupplierFoldersBtn" type="button" class="btn alt">Oppdater</button>
916          </div>
917        </div>
918        <div id="supplierFoldersList" class="sharepoint-list" aria-live="polite"></div>
919      </section>
920
921      <section id="adminView" class="dashboard-page placeholder-page" data-dashboard-page="admin" hidden>
922        <div class="placeholder-header">
923          <h2>Admin</h2>
924          <p class="muted-text">Adminfunksjoner &aring;pnes fra menyen n&aring;r brukeren har tilgang.</p>
925        </div>
926      </section>
927    </section>
928  </main>
929
930  <div id="expModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="expTitle">
931    <div class="modal">
932      <h3 id="expTitle">Er det sammenhengende 30 meter rett skinne?</h3>
933      <p>Velg Ja for &aring; legge til ekspansjonsledd.</p>
934      <div class="actions">
935        <button id="expNo" class="btn alt">Nei</button>
936        <button id="expYes" class="btn">Ja</button>
937      </div>
938    </div>
939  </div>
940
941  <div id="loginModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="loginTitle">
942    <div class="modal">
943      <h3 id="loginTitle">Logg p&aring;</h3>
944      <form class="login-form" onsubmit="return false;" autocomplete="off">
945        <button id="microsoftLoginBtn" type="button" class="btn microsoft-login-btn">Logg p&aring; med Microsoft</button>
946        <div class="login-divider" aria-hidden="true" hidden><span>eller</span></div>
947        <label for="loginUsername" hidden>Brukernavn (e-post)
948          <input id="loginUsername" type="text" inputmode="text" autocomplete="username">
949        </label>
950        <label for="loginPassword" hidden>Passord
951          <input id="loginPassword" type="password" autocomplete="current-password" required>
952        </label>
953        <div class="register-inline" hidden>
954          <span>Ved f&oslash;rste innlogging opprett ny bruker</span>
955          <button id="registerSubmit" type="button" class="btn alt btn-small">Opprett bruker</button>
956        </div>
957        <p id="loginError" class="login-error" role="alert"></p>
958        <div class="actions">
959          <button id="loginCancel" type="button" class="btn alt">Avbryt</button>
960          <button id="loginSubmit" type="button" class="btn" hidden>Logg p&aring;</button>
961        </div>
962      </form>
963    </div>
964  </div>
965
966  <div id="dashboardProjectStatusModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="dashboardProjectStatusTitle">
967    <div class="modal dashboard-project-status-modal">
968      <h3 id="dashboardProjectStatusTitle">Prosjekter</h3>
969      <p id="dashboardProjectStatusSubtitle" class="muted-text"></p>
970      <div id="dashboardProjectStatusList" class="dashboard-status-project-list"></div>
971      <div class="actions">
972        <button id="dashboardProjectStatusOpenAllFlow" type="button" class="btn" hidden>Vis alle prosjekter</button>
973        <button id="dashboardProjectStatusClose" type="button" class="btn alt">Lukk</button>
974      </div>
975    </div>
976  </div>
977
978  <div id="dashboardRecommendedActionsModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="dashboardRecommendedActionsTitle">
979    <div class="modal dashboard-recommended-actions-modal">
980      <h3 id="dashboardRecommendedActionsTitle">Anbefalte handlinger</h3>
981      <p id="dashboardRecommendedActionsSubtitle" class="muted-text"></p>
982      <label class="dashboard-recommended-actions-search" for="dashboardRecommendedActionsSearch">
983        Søk i anbefalte handlinger
984        <input id="dashboardRecommendedActionsSearch" type="search" autocomplete="off" placeholder="Søk etter prosjekt, e-post eller handling">
985      </label>
986      <div id="dashboardRecommendedActionsModalList" class="dashboard-recommended-actions-modal-list"></div>
987      <div class="actions">
988        <button id="dashboardRecommendedActionsClose" type="button" class="btn alt">Lukk</button>
989      </div>
990    </div>
991  </div>
992
993  <div id="registerModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="registerTitle">
994    <div class="modal">
995      <h3 id="registerTitle">Opprett bruker</h3>
996      <form class="login-form" onsubmit="return false;" autocomplete="off">
997        <label for="registerName">Navn *
998          <input id="registerName" type="text" autocomplete="name" placeholder="Ola Nordmann" required>
999        </label>
1000        <label for="registerEmail">E-post *
1001          <input id="registerEmail" type="email" inputmode="email" autocomplete="email" placeholder="[email protected]" required>
1002        </label>
1003        <label for="registerPhone">Telefon *
1004          <input id="registerPhone" type="tel" autocomplete="tel" placeholder="+47 12 34 56 78" required>
1005        </label>
1006        <label for="registerCompany">Selskap *
1007          <input id="registerCompany" type="text" autocomplete="organization" placeholder="Busbar AS" required>
1008        </label>
1009        <label for="registerPosition">Stilling *
1010          <input id="registerPosition" type="text" autocomplete="organization-title" placeholder="Prosjektleder" required>
1011        </label>
1012        <label for="registerPassword">Passord *
1013          <input id="registerPassword" type="password" autocomplete="new-password" required>
1014        </label>
1015        <label for="registerConfirmPassword">Bekreft passord *
1016          <input id="registerConfirmPassword" type="password" autocomplete="new-password" required>
1017        </label>
1018        <p id="registerError" class="login-error" role="alert"></p>
1019        <div class="actions">
1020          <button id="registerCancel" type="button" class="btn alt">Avbryt</button>
1021          <button id="registerCreateBtn" type="button" class="btn">Opprett bruker</button>
1022        </div>
1023      </form>
1024    </div>
1025  </div>
1026
1027  <form id="projectForm" class="project-form" onsubmit="return false;" autocomplete="off" hidden>
1028        <label>Prosjektnavn
1029          <div class="suggest-wrapper">
1030            <input id="projectNameInput" type="text" autocomplete="off" required>
1031            <ul id="projectSuggestions" class="suggestions" hidden></ul>
1032          </div>
1033        </label>
1034        <label>Kunde
1035          <div class="suggest-wrapper">
1036            <input id="customerNameInput" type="text" autocomplete="off" required>
1037            <ul id="customerSuggestions" class="suggestions" hidden></ul>
1038          </div>
1039        </label>
1040        <label>Kontaktperson
1041          <div class="suggest-wrapper">
1042            <input id="contactPersonInput" type="text" autocomplete="off" required>
1043            <ul id="contactSuggestions" class="suggestions" hidden></ul>
1044          </div>
1045        </label>
1046        <p id="projectError" class="login-error project-error" role="alert"></p>
1047        <div class="actions">
1048          <button id="projectSubmit" type="button" class="btn" disabled>Fortsett</button>
1049          <button id="projectCancel" type="button" class="btn alt">Avbryt</button>
1050        </div>
1051  </form>
1052
1053  <div id="projectDetailsModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="projectDetailsTitle">
1054    <div class="modal">
1055      <h3 id="projectDetailsTitle">
1055Kundeinformasjon</h3>
1056      <form class="project-form" onsubmit="return false;" autocomplete="off">
1057        <label for="projectDetailsCustomer">Kunde
1058          <input id="projectDetailsCustomer" type="text" disabled>
1059        </label>
1060        <label for="projectDetailsAddress">Adresse
1061          <input id="projectDetailsAddress" type="text" autocomplete="street-address" required>
1062        </label>
1063        <label for="projectDetailsPostalPlace">Postnummer og sted
1064          <input id="projectDetailsPostalPlace" type="text" autocomplete="postal-code" required>
1065        </label>
1066        <label for="projectDetailsContact">Kontaktperson
1067          <input id="projectDetailsContact" type="text" disabled>
1068        </label>
1069        <label for="projectDetailsPhone">Telefon
1070          <input id="projectDetailsPhone" type="tel" autocomplete="tel" required>
1071        </label>
1072        <p id="projectDetailsError" class="login-error project-error" role="alert"></p>
1073        <div class="actions">
1074          <button id="projectDetailsCancel" type="button" class="btn alt">Avbryt</button>
1075          <button id="projectDetailsSubmit" type="button" class="btn">Lagre</button>
1076        </div>
1077      </form>
1078    </div>
1079  </div>
1080
1081  <div id="offerDetailsWarningModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="offerDetailsWarningTitle">
1082    <div class="modal">
1083      <h3 id="offerDetailsWarningTitle">Mangler detaljer</h3>
1084      <p class="muted-text">Prosjektet mangler f&oslash;lgende felt:</p>
1085      <ul id="offerDetailsMissingList" class="missing-details-list"></ul>
1086      <p>Kontakt administrator for &aring; legge til detaljer</p>
1087      <div class="actions">
1088        <button id="offerDetailsCancel" type="button" class="btn alt">Avbryt</button>
1089        <button id="offerDetailsContinue" type="button" class="btn">Generer likevel</button>
1090      </div>
1091    </div>
1092  </div>
1093
1094  <div id="projectMarginModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="projectMarginTitle">
1095    <div class="modal">
1096      <h3 id="projectMarginTitle">Sett prosjekt-DG</h3>
1097      <form class="project-form" onsubmit="return false;" autocomplete="off">
1098        <p id="projectMarginCurrent" class="muted-text">N&aring;v&aelig;rende DG vises her.</p>
1099        <label for="projectMarginPercentInput">DG (%)
1100          <input id="projectMarginPercentInput" type="text" inputmode="decimal" placeholder="Eks. 20" required>
1101        </label>
1102        <p id="projectMarginError" class="login-error project-error" role="alert"></p>
1103        <div class="actions">
1104          <button id="projectMarginCancel" type="button" class="btn alt">Avbryt</button>
1105          <button id="projectMarginSubmit" type="button" class="btn">Lagre</button>
1106        </div>
1107      </form>
1108    </div>
1109  </div>
1110
1111  <div id="linePriceAdjustModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="linePriceAdjustTitle">
1112    <div class="modal">
1113      <h3 id="linePriceAdjustTitle">Juster priser</h3>
1114      <p id="linePriceAdjustLine" class="muted-text"></p>
1115      <form id="linePriceAdjustForm" class="project-form line-price-adjust-form" onsubmit="return false;" autocomplete="off">
1116        <label for="lineAdjustMaterialInput">Materiellkost
1117          <input id="lineAdjustMaterialInput" type="text" inputmode="decimal">
1118        </label>
1119        <label for="lineAdjustMontasjeInput">Montasje
1120          <input id="lineAdjustMontasjeInput" type="text" inputmode="decimal">
1121        </label>
1122        <label for="lineAdjustEngineeringInput">Ingeni&oslash;r
1123          <input id="lineAdjustEngineeringInput" type="text" inputmode="decimal">
1124        </label>
1125        <label for="lineAdjustOpphengInput">Opphengsmateriell
1126          <input id="lineAdjustOpphengInput" type="text" inputmode="decimal">
1127        </label>
1128        <p id="linePriceAdjustError" class="login-error project-error" role="alert"></p>
1129        <div class="actions">
1130          <button id="linePriceAdjustReset" type="button" class="btn alt">Tilbakestill</button>
1131          <button id="linePriceAdjustCancel" type="button" class="btn alt">Avbryt</button>
1132          <button id="linePriceAdjustSubmit" type="button" class="btn">Lagre</button>
1133        </div>
1134      </form>
1135    </div>
1136  </div>
1137
1138  <div id="projectStatusModal" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="projectStatusTitle">
1139    <div class="modal">
1140      <h3 id="projectStatusTitle">Endre prosjektstatus</h3>
1141      <p id="projectStatusProjectName" class="muted-text"></p>
1142      <div class="project-status-options">
1143        <button type="button" class="btn alt" data-project-status-option="unresolved">Uavklart</button>
1144        <button type="button" class="btn alt" data-project-status-option="won">Vunnet</button>
1145        <button type="button" class="btn alt" data-project-status-option="lost">
1145Tapt</button>
1146        <button type="button" class="btn alt" data-project-status-option="finished">Ferdig</button>
1147      </div>
1148      <div class="actions">
1149        <button id="projectStatusCancel" type="button" class="btn alt">Avbryt</button>
1150      </div>
1151    </div>
1152  </div>
1153
1154  
1154<script type="module" src="app.js"></script>
1154
1155</body>
1156</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.