Basic elm functionality

This commit is contained in:
Emi Simpson 2022-02-01 17:33:58 -05:00
commit eb0e736a2f
Signed by: Emi
GPG key ID: A12F2C2FFDC3D847
3 changed files with 341 additions and 0 deletions

25
elm.json Normal file
View file

@ -0,0 +1,25 @@
{
"type": "application",
"source-directories": [
"src"
],
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"elm/browser": "1.0.2",
"elm/core": "1.0.5",
"elm/html": "1.0.0",
"rtfeldman/elm-sorter-experiment": "2.1.1"
},
"indirect": {
"elm/json": "1.1.3",
"elm/time": "1.0.0",
"elm/url": "1.0.0",
"elm/virtual-dom": "1.0.2"
}
},
"test-dependencies": {
"direct": {},
"indirect": {}
}
}

69
src/Main.elm Normal file
View file

@ -0,0 +1,69 @@
module Main exposing (main)
import Browser
import Sort.Set exposing (Set)
import Html exposing (Html, div, input, label, p, text, h3)
import Html.Events exposing (onCheck)
import Html.Attributes exposing (class, type_)
import Modules exposing
( Module
, all_modules
, module_property
, module_desc
, module_sorter
)
main: Program () Model Msg
main =
Browser.sandbox { init = init, update = update, view = view }
-- INIT + Model
type alias Model =
{ enabled_modules : Set Module
}
init : Model
init =
{ enabled_modules = Sort.Set.empty module_sorter
}
-- UPDATE
type Msg
= ToggleModule Module Bool
add_or_remove : Bool -> (a -> Set a -> Set a)
add_or_remove active =
if active then
Sort.Set.insert
else
Sort.Set.remove
update : Msg -> Model -> Model
update msg model =
case msg of
ToggleModule mod enabled ->
{ model | enabled_modules = add_or_remove enabled mod model.enabled_modules }
-- VIEW
view_module_button : Set Module -> Module -> Html Msg
view_module_button enabled mod =
label
(if Sort.Set.memberOf enabled mod then [class "active"] else [])
[ input
[ type_ "checkbox"
, onCheck (ToggleModule mod)
] []
, h3 [] [ text (module_property .name mod) ]
, p [] (module_desc mod)
]
view : Model -> Html Msg
view model =
div [] (
all_modules
|> List.map (view_module_button model.enabled_modules)
)

247
src/Modules.elm Normal file
View file

@ -0,0 +1,247 @@
module Modules exposing
( Module
, all_modules
, ModuleInfo
, module_info
, module_property
, module_desc
, module_sorter
)
import Html exposing (Html, text, a)
import Html.Attributes exposing (href)
import Sort exposing (Sorter)
type Module
= CarbonUnderground
| Ecocide
| Extractive
| BDS
| Taliban
| Myanmar
| XinjiangUygar
| UsTariff
| Surveillance
| Military
| LawEnforcement
| Media
| SocialAuditing
| BoardOfDirectors
| SupplyChain
| Copyleft
all_modules : List Module
all_modules =
[ CarbonUnderground
, Ecocide
, Extractive
, BDS
, Taliban
, Myanmar
, XinjiangUygar
, UsTariff
, Surveillance
, Military
, LawEnforcement
, Media
, SocialAuditing
, BoardOfDirectors
, SupplyChain
, Copyleft
]
type alias ModuleInfo =
{ name: String
, desc: List (Html Never)
, index: Int
}
module_info : Module -> ModuleInfo
module_info mod = case mod of
CarbonUnderground ->
{ name = "Carbon Underground 200"
, desc =
[ text
"""
Disallow use by the top global publicly-owned coal, oil, and gas reserve (judged
by
"""
, a
[ href "https://www.ffisolutions.com/research-analytics-index-solutions/research-screening/the-carbon-underground-200/"
]
[ text "the FFI Carbon Underground 200)" ]
]
, index = 0
}
Ecocide ->
{ name = "Ecocide"
, desc = [text "Disallow anyone who knowingly commits widespread or long term ecocide"]
, index = 1
}
Extractive ->
{ name = "Extractive Industries"
, desc =
[text
"""
Disallow use by anyone involved in fossil fuel / mineral exploitation,
extraction, development, and sale
"""
]
, index = 2
}
BDS ->
{ name = "BDS (Boycott, Divestment, Sanctions)"
, desc =
[ text "Disallow use by anyone on the "
, a
[ href "https://bdsmovement.net/" ]
[ text "Boycott, Divestment, Sanctions'" ]
, text "list"
]
, index = 3
}
Taliban ->
{ name = "Taliban"
, desc = [text "Disallow use by anyone who trades with, works with, or is the Taliban"]
, index = 4
}
Myanmar ->
{ name = "Myanmar"
, desc =
[ text
"""
Disallow use by anyone who trades with, works with, or is the Myanmar/Burmese
military
"""
]
, index = 5
}
XinjiangUygar ->
{ name = "Xinjiang Uygur Autonomous Region"
, desc =
[ text
"""
Disallow use by anyone who works with or is someone who benefits from goods
produced in the Xinjiang Uygur Autonomous Region of China
"""
]
, index = 6
}
UsTariff ->
{ name = "U.S. Tariff Act"
, desc =
[ text
"""
Disallow use by anyone who works with or is someone who the U.S. Customs and
Border Protection believes uses forced labor
"""
]
, index = 7
}
Surveillance ->
{ name = "Mass Surveillance"
, desc =
[ text
"""
Disallow use by anyone who works with or is a goverment/multinational corporation
who participates in a mass-surveilence program
"""
]
, index = 8
}
Military ->
{ name = "Military Activities"
, desc =
[ text
"""
Disallow use by anyone who works with or is a goverment/multinational corporation
who conducts military activities
"""
]
, index = 9
}
LawEnforcement ->
{ name = "Law Enforcement"
, desc =
[ text
"""
Disallow use by anyone who works with or anyone who trades with or offers support
to local, state, or federal law enforcement
"""
]
, index = 10
}
Media ->
{ name = "Media"
, desc =
[ text
"""
Disallow use by anyone who is or works with someone who broadcasts messages
promoting violence
"""
]
, index = 11
}
SocialAuditing ->
{ name = "Social Auditing"
, desc =
[ text
"""
Require that organizations that use your software only use social auditing methods
that adhere to the principles of the
"""
, a
[ href "https://wsr-network.org/what-is-wsr/statement-of-principles/" ]
[ text "Worker-Driven Social Responsibility Network," ]
, text
"""
or not use social auditing methods at all
"""
]
, index = 12
}
BoardOfDirectors ->
{ name = "Workers on Board of Directors"
, desc =
[ text
"""
If the organization using your software has a board of directors, require that
they have at least 30% of the seats on the board be paid less than twice the
amount of the the lowest paid worker in the organization
"""
]
, index = 13
}
SupplyChain ->
{ name = "Supply Chain Transparency"
, desc =
[ text
"""
Require that whoever uses your software must publish information about their
supply chain on a public website
"""
]
, index = 14
}
Copyleft ->
{ name = "Copyleft"
, desc =
[ text
"""
Require that any modifications or derivitive works based on your software or
source code be licensed under the exact same license
"""
]
, index = 15
}
module_property : (ModuleInfo -> a) -> Module -> a
module_property adapter mod = adapter (module_info mod)
module_desc : Module -> List (Html a)
module_desc mod =
module_property .desc mod
|> List.map (Html.map never)
module_sorter : Sorter Module
module_sorter = Sort.by (module_property .index) Sort.increasing