# `MishkaDocumentWeb.SidebarMenu`
[🔗](https://github.com/mishka-group/mishka_document/blob/v0.0.1/lib/mishka_document_web/sidebar_menu.ex#L5)

The document extension's admin pages and the one sidebar entry that links to them — a
`"sidebar:menus"` plugin (`MishkaCmsCore.Sidebar`).

Only `document` is a link; it lands in the core's **Plugins** section. The core never names this
extension, so removing it removes the entry and nothing in `MishkaCmsCore.Sidebar` changes.

The other eight are `nav: false` — pages, not links. They are declared because they do NOT share
one answer to "who may open this": the workspace pages are `admin:dashboard:document:workspace`,
everything hanging off a section is `admin:dashboard:document:section`, and the event log opens
for either and shows each area the events of its own records (`MishkaDocument.EventLog.logged/1`). The
link carries the union, since holding either is reason enough to be shown the section. The data
behind each page asks for the same area.

Three of them are parameterised routes that could never be a static link anyway
(`/document/sections/:workspace_version_id` and friends) — declaring them here is the only place
their gate can be written down.

Each page reads its own gate from here, so the permission is written down once:

    on_mount {MishkaCmsCore.LiveUserAuth,
              {:require_permission, MishkaDocumentWeb.SidebarMenu.permissions("document.issues")}}

Registered in MishkaDocument.Application.

# `error_return`

```elixir
@type error_return() ::
  {:error, [%{action: atom(), field: atom(), message: String.t()}]}
```

# `okey_return`

```elixir
@type okey_return() :: {:ok, struct() | map() | module() | [any()]}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `config`

```elixir
@spec config() :: keyword()
```

# `config`

```elixir
@spec config(atom()) :: any()
```

# `enable`

```elixir
@spec enable() :: okey_return() | error_return()
```

# `get`

```elixir
@spec get() :: keyword()
```

# `health_check`

```elixir
@spec health_check() :: :ok | {:degraded, term()} | {:error, term()}
```

Optional. See `c:MishkaInstaller.Event.Hook.health_check/0`. Override to report health.

# `items`

```elixir
@spec items() :: [MishkaCmsCore.Sidebar.Item.t()]
```

This extension's sidebar entry plus every admin page it owns.

# `on_dependency_error`

```elixir
@spec on_dependency_error(term()) :: term()
```

Optional. See `c:MishkaInstaller.Event.Hook.on_dependency_error/1`. Override to react.

# `permissions`

```elixir
@spec permissions(String.t()) :: [
  MishkaCmsCore.Accounts.Checks.AccessPermissions.requirement()
]
```

The permissions declared for one of this extension's pages. See `MishkaCmsCore.Sidebar.permissions/2`.

# `register`

```elixir
@spec register() :: okey_return() | error_return()
```

# `restart`

```elixir
@spec restart() :: okey_return() | error_return()
```

# `start`

```elixir
@spec start() :: okey_return() | error_return()
```

# `start_link`

# `stop`

```elixir
@spec stop() :: okey_return() | error_return()
```

# `unregister`

```elixir
@spec unregister() :: okey_return() | error_return()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
